pringBoot与Shiro的集成是实现权限管理的一种有效方式。以下是对SpringBoot+Shiro权限管理的详细介绍:
一、Shiro简介
Shiro是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中。它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。Shiro基于session进行身份认证和访问控制,包括以下几个核心组件:
- Subject:主体,代表了当前用户,可以是任何第三方系统帐号。每个Subject实例都会绑定到SecurityManager上。
- SecurityManager:安全管理器,管理所有Subject,可以配合内部安全组件。它是Shiro的核心,主要协调Shiro内部的各种安全组件。
- Realms:域,用于进行权限信息的验证,一般需要自己实现,是用户数据和Shiro数据交互的桥梁。
- Authentication:身份认证/登录(账号密码验证)。
- Authorization:授权,即角色或者权限验证。
- Session Manager:会话管理,用户登录后的session相关管理。
- Cryptography:加密,密码加密等。
此外,Shiro还提供了Web支持、缓存功能、记住我、多线程并发验证等特性。
动态菜单
动态菜单:系统里面有很多菜单可以进行点击操作,但是不同的角色用户能够操作的菜单肯定是不会相同的,那么,就需要用角色来区分用户,进而区分用户所能看到/操作的菜单。
准备测试数据
还是使用之前的两个用户,hlliu和t114,hlliu设置为角色1(管理员),t114设置为角色2(客户经理),管理员至少拥有“权限管理”权限,客户管理拥有“营销管理”,“客户管理”等权限
获取动态菜单
用户登录成功之后,需要获取到用户相应的动态菜单数据,此功能代码前面章节已经实现,在IndexController类的login方法中,具体代码如下:
// 认证(登录)成功
User user = (User) subject.getPrincipal();
// 获取权限
Role role = user.getRole(); // 如果一对多关联不是立即加载,则需要通过用户获取
List<Right> rights = roleService.findRightsByRole(role);
role.getRights().addAll(rights);
session.setAttribute("loginUser", user);
显示动态菜单
<li class="active">
<a>
<i class="fa fa-home"></i> <span>权限管理</span>
<span class="fa fa-chevron-down"></span>
</a>
<ul class="nav child_menu" style="display: block;">
<li class="current-page">
<a th:href="@{/user/list}" href="/crm/user/list">用户管理
</a>
</li>
<li>
<a href="/role/list">角色管理</a>
</li>
</ul>
</li>
角色管理
前面我们实现了用户管理,接下来我们实现角色管理,角色管理和用户管理实现的功能差不读,最大的区别在于新增或修改角色时,需要指定角色拥有的权限,这也是角色管理中的一处冲难点。
Model模型开发
1、entity包括Role.java和Right.java,且两个对象是多对多关系,前面已经实现。
2、Repository包括 RoleRepository.Java 和 RightRepository.Java,前面已经实现,且在RoleRepository.java中添加根据角色名称进行模糊查询并分页的方法:
Page<Role> rolePage(String roleName, Page<Role> rolePager);
3.service包括RoleService,添加对Role对象的增删查方法:
三、注意事项
-
密码加密:在存储用户密码时,应该使用加密方式存储。Shiro提供了多种密码加密方式,如MD5、SHA-256等。可以在自定义Realm的
doGetAuthenticationInfo
方法中使用HashedCredentialsMatcher
来设置密码加密方式。 - 会话管理:Shiro提供了会话管理功能,可以管理用户的会话信息。在配置Shiro时,可以设置会话的超时时间、会话存储方式等。
- 异常处理:在处理Shiro相关的异常时,应该进行友好的异常处理,并给出相应的提示信息。可以使用Spring Boot的全局异常处理机制来处理Shiro的异常。
通过以上步骤,可以在Spring Boot项目中成功集成Shiro权限管理框架,并实现用户身份验证、角色管理和权限控制等功能。