如何正确使用isUserInRole(角色)

Han*_*sky 14 jsf servlets java-ee

防止用户角色执行操作.

  1. 示例1:角色"administrator"是允许执行销毁操作的唯一角色.
  2. 示例2:与"guest"不同的任何角色都可以执行CREATE操作.

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

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

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

if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
    || FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager") 
    || .....) {
  //....
}
Run Code Online (Sandbox Code Playgroud)

重现所有方法都很痛苦.像数百种方法的东西:(

Bal*_*usC 30

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

只有当用户具有所需角色时才在视图侧渲染按钮,否则完全隐藏它.

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

这对(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}" />
Run Code Online (Sandbox Code Playgroud)

  • @Rob:它纯粹是服务器端,而不是客户端或其他东西(它绝对不像 JavaScript/CSS display=none/block)并且在处理表单提交期间由 JSF 重新评估。另见例如http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked/2120183#2120183的第5点所以是的,你肯定错过了一些东西:) (2认同)

Boz*_*zho 7

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

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

        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令调用它:

if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) {
    ..
}
Run Code Online (Sandbox Code Playgroud)

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