基于springboot的shiro安全框架实例
shiro简介
Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序—从最小的移动应用程序到最大的web和企业应用程序,这里简单介绍几个核心功能:
ⅰ. 身份认证 验证用户是否为合法用户
ⅱ. 权限认证 验证某个用户是否有权限访问某个资源
ⅲ. 会话管理 管理特定用户的会话
ⅳ. 加解密 使用加密算法确保数据安全,同时仍然易于使用。
shiro的认证概念
我们先理解三个概念:
1.Subject
访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体
2.Principal
身份信息,是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)
3.credential
凭证信息,是只有主体自己知道的安全信息,如密码、证书等
shiro的工作流程
shiro的认证流程
shiro的认证逻辑
1.shiro会在过滤器的基础上引入自己的shirofilter
2.通过shirofilter代理自己的一系列过滤器链
3.用户通过shiro的认证过过滤器链之后会继续进行基础的过滤器链
基于shiro的登陆实现
1.建立一个springboot项目
2.导入shiro相关依赖
3.加入shiro的配置
4.登陆操作的简单实现
一.建立一个springboot项目
搭建项目时,注意引入web,数据库连接以及mybatisplus相关工具
二.导入shiro相关依赖
在pom里导入依赖shiro-spring-boot-web-starter,版本自选即可
三.加入shiro的配置
1.在自定义类加入shiro的拦截器链条
2.在配置文件application.yml中自定义身份认证受限时的跳转页面
3.自定义身份认证和权限认证。
自定义shiroRealm类继承AuthorizingRealm,从而实现两个方法,都是通过对比数据库信息与用户输入信息从而得到结果。
(1)身份认证doGetAuthenticationInfo
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
User user = (User) principals.getPrimaryPrincipal();
System.out.println(user);
//查找该用户所有的角色
List<Role> roleList = roleMapper.selectListByuserid(user.getUserId());
System.out.println(roleList);
Set<String> strRoles = roleList.stream()
.map(r -> r.getRoleName())
.collect(Collectors.toSet());
List<String> permissions = new ArrayList<>();
if(roleList.size()>0) {
//查找该用户所有的权限
permissions = permMapper.selectPermInRoleIds(roleList);
}
SimpleAuthorizationInfo authzInfo = new SimpleAuthorizationInfo();
authzInfo.setStringPermissions(new HashSet<>(permissions));
authzInfo.setRoles(strRoles);
return authzInfo;
}
(2)权限认证doGetAuthorizationInfo
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
Object username = authenticationToken.getPrincipal();
QueryWrapper<User> qw=new QueryWrapper<>();
qw.eq("username",username);
User user = userMapper.selectOne(qw);
return new SimpleAuthenticationInfo(user,user.getPassword(),getClass().getName());
}
四.登陆操作的简单实现效果
1.在controller层的测试类中,创建三个方法。
(1)登陆,任何用户可以进入
(2)学习,合法用户可以进入
(3)上课,用户老师权限可以进入
public class LoginController {
@PostMapping("/login")
public String login(String username,String password){
Subject subject = SecurityUtils.getSubject();
subject.login(new UsernamePasswordToken(username,password));
return "success";
}
@GetMapping("/study")
public String pay(){
return "success";
}
@GetMapping("/teach")
@RequiresPermissions("teach")
public String create(){
return "success";
}
}
2.在浏览器通过身份测试和权限测试
身份测试效果,学习页面需合法用户
1.未登陆时,跳转学习页面后会自动跳转回登录页面
2.登陆后,可以成功跳转学习页面
权限测试效果,上课页面需老师权限
1.学生用户登陆,进入上课页面受限
2.老师用户登陆,成功进入上课页面
shiro的数据库设计
RBAC:role based access control
1 基于角色的访问控制
2授权基于角色实现
3核心实体类
role 角色
permission 权限
user 用户
4数据库关系
user <----(user-role)—> role <----(role-permission)—> permission
总结
1.本文旨在帮助初学者学习,欢迎大家合理探讨。
2.本例只是shiro的一个简单实现,有诸多不足之处,希望大家理解。
3.更多的关于shiro的知识,大家可以在shiro官方文档查看,以下是链接
https://shiro.apache.org/
-