如何正确使用isUserInRole(角色)

时间:2011-06-29 17:27:15

标签: jsf servlets java-ee

防止用户角色执行操作。

  1. 示例1:角色“管理员” 是唯一允许执行的角色 摧毁行动。
  2. 示例2:与“guest”不同的任何角色都可以执行CREATE操作。
  3. 在实际案例中,我有这个:

    public String delete() {
     if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){
       //.....the action to perform
     }
     return "Denied";
    }
    

    我希望我可以使用EJB的注释@RolesAllowed()但我没有使用EJB而是使用ManagedBeans。 所以问题是:有没有办法同时使用多个角色?一些解决方法! 示例:如果必须允许对3个角色执行操作(管理员,主持人,经理)。我有义务这样做:

    if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
        || FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager") 
        || .....) {
      //....
    }
    

    重现所有方法都很痛苦。像数百种方法:(

3 个答案:

答案 0 :(得分:30)

这需要在视图方面进行控制。当你在某个网站上看到一个你没有足够权利按下的按钮并且因此在你这样做时会得到一个令人生畏的错误页面时,你自己发现它是非常烦人吗?

仅在用户具有所需角色时才在视图侧呈现按钮,否则完全隐藏它。

<h:commandButton value="Delete" action="#{bean.delete}" 
    rendered="#{request.isUserInRole('administrator')}" />

这对(CSRF)黑客不敏感,因为JSF在申请请求值阶段再次检查条件。

对于使用多个条件并在单个视图中反复重复使用多个条件,请考虑使用<c:set>为其提供简短别名。您甚至可以将它放在某个主模板的顶部,以便它可供所有子模板使用。

<c:set var="isPowerUser" value="#{request.isUserInRole('manager') or request.isUserInRole('administrator')}" scope="request" />
...
<h:commandButton rendered="#{isPowerUser}" />
...
<h:commandButton rendered="#{isPowerUser}" />

答案 1 :(得分:7)

您可以通过将逻辑移动到实用程序方法来缩短它:

public class AuthorizationUtils {
    public static boolean isUserInRoles(String[] roles) {
        for (String role : roles) {
            if (FacesContext........isUserInRole(role)) {
                return true;
            }
        }

        return false;
    }
}

然后用:

调用它
if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) {
    ..
}

如果您正在使用CDI,则可以创建一个处理@RolesAllowed注释的拦截器

答案 2 :(得分:1)

@ Mediterran81:所以基本上你正在寻找基于bean方法的授权解决方案......你如何实例化你的托管bean?您可能希望介绍一种简单的XML格式: -

<bean class="">
 <method name="">
  <role> xyz</role>
 </method>
</bean>

通过实用程序类读取此XML,然后您只需要调用Utility的静态方法来确定是否允许执行该方法。