如何正确使用isUserInRole(角色)



防止用户角色执行操作。

  1. 示例1:角色"管理员"是唯一允许执行的角色摧毁行动
  2. 示例2:任何不同于"来宾"的角色都可以执行CREATE操作

在一个真实的案例中,我有这个:

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

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

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

在所有的方法上复制是一种痛苦。类似于数百种方法:(

这需要在视图端进行控制。当你在某个网站上看到一个你没有足够权限按下的按钮,从而在这样做的时候得到一个令人生畏的错误页面时,你自己难道不觉得很烦人吗?

仅当用户具有所需角色时,才在视图侧渲染按钮,否则将其完全隐藏。

<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}" />

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

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注释

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

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

让这个XML由实用工具类读取,然后只需要调用实用工具的静态方法来确定是否允许执行该方法。

相关内容

  • 没有找到相关文章

最新更新