Security 注销用户-Java EE 6安全性

Security 注销用户-Java EE 6安全性,security,jakarta-ee,servlets,jboss,Security,Jakarta Ee,Servlets,Jboss,我有一个表示安全内容的servlet,注释如下: @WebServlet(name = "GreetingServlet", urlPatterns = {"/greeting"}) @ServletSecurity( @HttpConstraint( rolesAllowed = {"TutorialUser"} ) ) 和web.xml,如下所示: <web-app xmlns="http://java.sun.com/xml/ns/

我有一个表示安全内容的servlet,注释如下:

@WebServlet(name = "GreetingServlet", urlPatterns = {"/greeting"})

@ServletSecurity(
        @HttpConstraint(
            rolesAllowed = {"TutorialUser"} ) )
和web.xml,如下所示:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
  <display-name>hello2_basicauth</display-name>


  <!--other servlet names and mappings are defined via annotations-->


  <security-role>
    <role-name>TutorialUser</role-name>
  </security-role>

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>file</realm-name>
  </login-config>
</web-app>
但是它不起作用(我仍然可以访问/greeting上的资源,而无需登录)。 控制台在访问/logout时记录此操作:

 INFO  [servlets.Logout] (http--127.0.0.1-8080-4) ---- Principal = duke3                                                                                              
 INFO  [servlets.Logout] (http--127.0.0.1-8080-4) ---- Principal = null  

是的,这就是基本身份验证的工作方式。大致顺序如下:


  • 通过基本身份验证,浏览器会记住受保护的资源和凭据,并在每次请求时将其发送回受保护的资源
  • 服务器创建会话并基于会话cookie授权用户,尽管凭据会再次发送(因此服务器不必每次查看数据库,每个会话只需查看一次)
  • 将调用注销servlet并正确销毁会话。但是,随着下一个对受保护资源的请求,浏览器将发送凭据,服务器将透明地让用户重新登录!(您可以通过检查注销后会话cookie是否已更改来验证这一点。)
可以做些什么

  • 接受工作方式,即根据基本身份验证调整逻辑
  • 使用表单身份验证(更漂亮,并且像您期望的那样工作)

  • 使用基本身份验证时,浏览器很可能缓存了凭据。浏览器请求的标题为:Authorization:BASIC ZHVrZTM6bnVrZW0=一旦用户通过身份验证。为了再次看到登录提示,我必须关闭整个浏览器(关闭选项卡是不够的)。我不知道为什么以及如何强制注销,一旦用户访问了我的/logout servlet:/Thank@Nikos,在我尝试表单之前,我想完全了解基本的工作原理。如果调用request.logout(),sessionId将保持不变。如果调用session.invalidate(),会话id将更改,浏览器将创建一个保存更新的会话id的cookie(JSSessionID)。我想知道浏览器中存储的凭据在哪里。原因JSSessionID cookie似乎没有。除非会话cookie确实使用一些智能哈希存储凭据,例如,在使会话无效时,我的会话cookie将如下更改:JSSessionID=vZX-uZXIpGIphsVWzoZWDWrn.undefined JSSessionID=obMR2+JOAiXtzDWLXtWAmOhg.undefinedYou关于
    请求.logout()是正确的
    -
    会话.无效()
    。我总是选择
    session.invalidate()
    进行注销,否则(注销的)会话仍将保留登录会话中的(可能敏感的)数据。(我错误地认为
    request.logout()
    也会这样做)。会话cookie通常不存储任何信息;这是一个随机数,用作存储会话数据的服务器中映射的密钥。浏览器中存储的凭据也是这样吗?除了这个带有sessionID的cookie之外,我找不到任何东西了:/I我想,例如,在Firefox中,您可以在“保存的密码”下的“首选项”的“安全性”选项卡中找到存储的凭据(我想名称取决于版本/系统)。我现在没有东西要测试。可能是在浏览器关闭之前(即在内存中),基本密码不会持久存储。您将在Firebug的“cookies”选项卡中找到cookies。
     INFO  [servlets.Logout] (http--127.0.0.1-8080-4) ---- Principal = duke3                                                                                              
     INFO  [servlets.Logout] (http--127.0.0.1-8080-4) ---- Principal = null