【问题标题】:Role-based access control with Spring MVC使用 Spring MVC 进行基于角色的访问控制
【发布时间】:2011-11-02 16:29:09
【问题描述】:

我想知道使用 spring 进行基于角色的访问控制的最佳实践。

我的要求是,

我将分配给用户的一组角色说,

user1=admin, user2=expert

user1 将拥有像这样写的访问权限

/admin/会员管理

/admin/项目管理

......

对于用户 2....

/myproject1/*

所以如果 user2 尝试 访问 url

/admin/会员管理

将被重定向到授权失败页面。

【问题讨论】:

    标签: authentication spring-mvc authorization


    【解决方案1】:

    与 Spring MVC 一起使用的标准框架是 Spring Security。虽然它可能非常复杂,但这里有一个您需要的最小版本:4.2.2 A Minimal Configuration

    在您的情况下,配置将是这样的:

    <http auto-config='true'>
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    </http>
    

    【讨论】:

      【解决方案2】:

      Spring Security 有角色的概念,但开箱即用它没有权限的概念。它确实有ACLs 的概念,但是这个 ACL 比权限复杂得多,并且它们与对特定对象的操作相关联,而不是一般的授权操作。

      看看Apache Shiro。它的角色和permissions 看起来与您提供的示例非常相似(使用通配符)。也是easy to use with Spring。

      【讨论】:

        【解决方案3】:
        public class DashBoardController {
        
        @Autowired
        UserService userService;
        
        private static final Logger logger = LoggerFactory.getLogger(DashBoardController.class);
        
        @SuppressWarnings("unchecked")
        @RequestMapping(value = PathProxy.DashBoardUrls.SHOW_DASHBOARD, method = RequestMethod.GET)
        public String role(Locale locale, Model model) {
            String userRole = null;
            logger.info("dashboard Controller");
            Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder
                    .getContext().getAuthentication().getAuthorities();
            for (SimpleGrantedAuthority simpleGrantedAuthority : authorities) {
                userRole = simpleGrantedAuthority.toString();
            }
        
            switch (userRole) {
        
            case "ROLE_ADMIN":
        
                return "dashboard/admin";
        
            case "ROLE_HR_MANAGER":
        
                return "dashboard/hr_manager";
        
            case "ROLE_MANAGER":
        
                return "dashboard/manager";
        
            case "ROLE_EMPLOYEE":
        
                return "dashboard/employee";
        
            case "ROLE_COMPANY_ADMIN":
        
                return "dashboard/admin";
        
            default:
        
                break;
            }
        
            return userRole;
        
        }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 2016-05-06
          • 2010-09-11
          • 1970-01-01
          • 2013-08-28
          • 2012-01-25
          • 1970-01-01
          相关资源
          最近更新 更多