规格:
Servlet:3.0
Java:7
Tomcat:7.0.54
说明:
可以使用方法 HttpServletRequest.isUserInRole()
以编程方式检查用户是否具有特定角色例如:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
String username = null;
String password = null;
//get username and password manually from Authorization header
//...
request.login(username, password);
if (request.isUserInRole("boss")) {
//do something
} else {
//do something else
}
request.logout();
}
这很好用,但此解决方案需要从Authorization标头手动检索用户名和密码,然后使用这些凭据登录。
问题:
是否可以做这样的事情?没有从标题中检索数据并手动登录()?
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
if (request.isUserInRole("boss")) {
//do something
} else {
//do something else
}
}
试着回答自己:
根据我的理解,此代码需要在web.xml中进行适当的配置。此示例适用于web.xml文件中的此配置,例如:
<web-app ...>
...
<security-constraint>
<web-resource-collection>
<url-pattern>/HelloWorld</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>boss</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>DefaultRealm</realm-name>
</login-config>
</web-app>
但这意味着不需要以编程方式检查角色,因为在web.xml中配置我们只需要限制访问。
要点:
感谢。
编辑1:
由于第一个答案建议将 login-config 元素添加到我的web.xml中,我必须说我已经拥有它。我将此添加到代码段中,因为在发布问题时我没有将其包含在内。示例适用于此配置。但是,当我删除 auth-constraint 或整个 security-constraint 时,不会出现 login-config 。
我添加了有关容器的信息:Tomcat 7.0.54。
答案 0 :(得分:3)
<强>问题1:强>
是否可以在不指定web.xml中的限制(auth-constraint)的情况下以编程方式检查角色?
答案:
是的,有可能。无需在web.xml中指定限制。没有必要在web.xml中放置 scurity-contraint 。
此外,无需从标题授权手动检索凭据,然后手动登录()。
<强>解决方案:强>
这是一个有效的例子:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
request.authenticate(response); //solution
if (request.isUserInRole("boss")) {
//do something
} else {
//do something else
}
}
web.xml中:
<web-app ...>
...
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>DefaultRealm</realm-name>
</login-config>
</web-app>
这很有效。
正如你看到的方法 HttpServletRequest.authenticate()一样,nad就可以了。 文档说:
如果请求是针对受安全约束保护的资源,则触发与触发相同的身份验证过程。
这就是我们所需要的一切。 我希望它能帮助将来的某个人。
答案 1 :(得分:0)
以下是您的问题的答案,如果您使用的是基本身份验证,请添加:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ourRealm</realm-name>
</login-config>
答案 2 :(得分:0)