Servlet - isUserInRole()

时间:2014-06-19 08:59:18

标签: java security java-ee servlet-3.0

规格:

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中配置我们只需要限制访问。

要点:

  • 是否可以以编程方式检查角色而无需在web.xml中指定限制(auth-constraint)?
  • 如果没有,这是否意味着,使用 isCallerInRole()只执行检查其他角色,因为在web.xml中指定了主要的必需角色?

感谢。

编辑1:
由于第一个答案建议将 login-config 元素添加到我的web.xml中,我必须说我已经拥有它。我将此添加到代码段中,因为在发布问题时我没有将其包含在内。示例适用于此配置。但是,当我删除 auth-constraint 或整个 security-constraint 时,不会出现 login-config 。 我添加了有关容器的信息:Tomcat 7.0.54。

3 个答案:

答案 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)

web.xml中servlet提供的基本授权机制是基本的,主要是“硬编码”

如果要实现更详细的检查用户角色/授权的方法,您需要保护servlet,然后您有几种可能性:

  • 正确实施JAAS。很少有教程;这是Tomcat
  • 的一个
  • 可能更强大的替代方法是使用Shiro