基本身份验证:是否有可能像setRemoteUser getRemoteUser()(Basic A

2019-07-30 03:41发布

嗨,我使用了保护某些网页在我的webapp的基本身份验证方法。 其中有一个指定的URL模式如下:

<url-pattern>/Important/*</url-pattern>
<auth-method>BASIC</auth-method>

现在的问题是,如果在使用登录表单.The数据发布到我的servlet这验证用户名和密码,然后以正常的方式在用户登录进一步前进。 有没有办法,我可以setRemoteUser在这个servlet,因为一旦用户尝试访问该文件夹中的重要页面中输入验证再次出现的一种方式。 有没有办法,我可以告知用户在已签定认证机制的方法吗?

Answer 1:

这是不可能的。 如果你有一个实际的HTML <form>进行登录,那么你应该从更改身份验证方法BASICFORM

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

您还需要确保你的HTML <form>提交给个预定义URL j_security_check与作为个预定义参数的用户名和密码j_usernamej_password

<form action="j_security_check" method="post">
    <input type="text" name="j_username" />
    <input type="password" name="j_password" />
    <input type="submit" value="login" />
</form>

通过这种方式,容器将设置登录你需要的方式和用户名将可通过getRemoteUser() 此外,谁直接访问受限制的URL任何未经验证的用户将被自动转发到登录页面。 成功登录后,它会自动转发回最初请求的页面。

此外,使用时FORM认证方法上一个Servlet 3.0兼容的容器(7的Tomcat,Glassfish的3等),则能够通过引入了Servlet 3.0以编程登录用户HttpServletRequest#login()在servlet方法。 这使得在对过程和验证的更多更细粒度的控制。 这是不可能的BASIC验证。

BASIC认证是一个完全不同的事情。 它显示了一个裸露的JavaScript看看一个样使用用户名/密码输入对话框。 这并不需要/使用HTML <form>什么的。 它还存储在其中获得发送作为对每一个后续请求的请求报头中的客户端的认证信息。 它不会在服务器端的会话认证信息存储等作为FORM认证。

也可以看看:

  • Java EE 6教程-入门保护Web应用程序


Answer 2:

该方法HttpServletRequest.getRemoteUser()预订购返回null ,如果用户没有登录。

这是对所有类型的认证也是如此。

这里是API文档所说的话:

java.lang.String getRemoteUser()

Returns the login of the user making this request, if the user has been 
authenticated, or null if the user has not been authenticated. Whether the user 
name is sent with each subsequent request depends on the browser and type of      
authentication. Same as the value of the CGI variable REMOTE_USER.

Returns:
    a String specifying the login of the user making this request, 
   or null if the user login is not known


文章来源: Basic Authentication : Is it possible to setRemoteUser like getRemoteUser()