【问题标题】:apache shiro allowing multiple roles to Access a url not workingapache shiro 允许多个角色访问一个 url 不起作用
【发布时间】:2013-02-05 12:06:33
【问题描述】:

我有一个简单的网络项目。我想在这个项目中访问多个角色是一个 URL。

sihor.ini 部分的 url

[urls]
/login.xhtml = authc
/logout = logout
/admin/** = user, roles[admin]
/guest/** = user, roles[admin,guest]

当用户管理员角色访问来宾目录时,我收到 401 错误。

为什么?

shiro 版本 1.2.1

【问题讨论】:

    标签: shiro


    【解决方案1】:

    还有另一种选择:使用OR 为提供的角色集而不是AND 自定义实现角色过滤器。

    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    
    /**
     * Allows access if current user has at least one role of the specified list.
     * 
     * Basically, it's the same as {@link RolesAuthorizationFilter} but using {@literal OR} instead
     * of {@literal AND} on the specified roles.
     *
     * @see RolesAuthorizationFilter
     * @author Andy Belsky
     */
    public class AnyOfRolesAuthorizationFilter extends RolesAuthorizationFilter {
    
        @Override
        public boolean isAccessAllowed(ServletRequest request, ServletResponse response,
                                       Object mappedValue) throws IOException {
    
            final Subject subject = getSubject(request, response);
            final String[] rolesArray = (String[]) mappedValue;
    
            if (rolesArray == null || rolesArray.length == 0) {
                //no roles specified, so nothing to check - allow access.
                return true;
            }
    
            for (String roleName : rolesArray) {
                if (subject.hasRole(roleName)) {
                    return true;
                }
            }
    
            return false;
        }
    }
    

    shiro.ini中的用法是这样的:

    [main]
    ...
    anyofroles = com.your.package.AnyOfRolesAuthorizationFilter
    
    [urls]
    ...
    /path/to/some/url = anyofroles["role1,role2"]
    

    【讨论】:

      【解决方案2】:

      代替

      /guest/** = user, roles[admin,guest]

      试一试

      /guest/** = user, roles[admin],roles[guest]
      

      【讨论】:

      • 好主意,但遗憾的是这不起作用,因为每个角色检查都被强制执行。
      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 2015-12-30
      • 2021-04-15
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      相关资源
      最近更新 更多