Shiro入门
说明:这是观看b站编程不良人UP主视频做的笔记,原视频链接如下:
https://www.bilibili.com/video/BV1uz4y197Zm?p=11&t=1306
1. 权限的管理
1.1什么是权限管理
基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略
控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份认证
和授权
两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。
1.2什么是身份认证
就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户是否正确。
2. 什么是Shiro
Apache Shiro™是一个功能强大且易于使用的Java安全框架,它执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。
3. Shiro的核心架构
- Security Manager:安全管理器,最重要的一个接口。
- Authenticator:认证
- Authorizer:授权
- Session Manager:存储用户会话
- Session DAO:对会话数据进行增删改查
- Cache Manager:缓存
- Pluggable Realms:域,获取认证和授权中的相应数据
4. Shiro中的认证
4.1 认证
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的一致。
4.2 Shiro中认证的关键对象
- Subject:主体
访问系统的用户,主体也可以是用户、程序等。
- Principal:身份信息
是主体进行身份认证的标识,标识具有唯一性
,如用户名、手机号、邮箱地址等。一个主体可以有多个身份,但必须有一个主身份。
- credential:凭证信息
是只有主体自己知道的安全信息,如密码、证书等。
4.3认证的开发
-
创建项目并引入依赖
<!--引入shiro--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency>
-
引入Shiro配置文件
以.ini结尾,对名字不讲究,只要放在maven资源目录中的任意一个位置中就可以,用来书写我们系统中相关权限数据
其内容来自数据库,但为了方便学习,Shiro提供了一种方法,我们可以在其中写死数据进行模拟学习,等实际使用再链接数据库
[users] root=sasa tyh=tyh
-
认证代码
public static void main(String[] args) { //1.创建安全管理器对象 DefaultSecurityManager securityManager = new DefaultSecurityManager(); //2.给安全管理器设置realm securityManager.setRealm(new IniRealm("classpath:shiro.ini")); //3.SecurityUtils 全局安全工具类设置安全管理器 SecurityUtils.setSecurityManager(securityManager); //4.关键对象 subject 主体 Subject subject = SecurityUtils.getSubject(); //5.创建令牌 UsernamePasswordToken token = new UsernamePasswordToken("root","sasa"); //6.用户认证 认证成功无返回,失败抛异常 try { System.out.println("认证状态:"+subject.isAuthenticated()); subject.login(token); System.out.println("认证状态:"+subject.isAuthenticated()); } catch (AuthenticationException e) { e.printStackTrace(); } }
-
自定义Realm
作用是之后认证/授权的数据来自数据库而非ini文件
//认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //在token中获取用户名 String principal = (String) token.getPrincipal(); System.out.println(principal); //根据身份信息使用jdbc、mybatis查询数据库,这里先用假数据 if("root".equals(principal)){ //参数1和2代表账号和密码,参数3提供当前realm的名字 SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo("root","sasa",this.getName()); return simpleAuthenticationInfo; } return null; }
-
MD5+Salt加密
MD5算法不可逆,如果内容相同无论执行多少次MD5生成的结果始终是一致的,生成结果始终是16进制32位字符串
Salt(盐),将明文加盐处理,即在后面加上随机字符,然后将密码和随机字符一起做MD5处理。
5. Shiro中的授权
5.1 授权
授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分别权限方可访问系统的资源,对某些资源是没有权限是无法访问的。
谁
对什么资源
有怎样的权限
5.2 授权方式
-
基于角色的访问控制
-
RBAC(Role-Based Access Control)
if(subject.hasRole("admin")){ //操作什么资源 }
-
-
基于资源的访问控制
-
RBAC(Resource-Based Access Control)
if(subject.isPermitted("user:update:01")){//资源实例 //对01用户进行修改 } if(subject.isPermitted("user:update:*")){//资源类型 //对01用户进行修改 }
权限字符串说明:
- 资源标识符:操作:资源实例标识符,意思是对哪个资源的哪个实例具体有什么操作,冒号是
资源/操作/实例
的分隔符,权限字符串也可以使用*通配符。 - 例子:
- 用户创建权限:user:create,或user:create:*
- 用户修改实例001的权限:user :update:001
- 用户实例001的所有权限:user:*:001
- 资源标识符:操作:资源实例标识符,意思是对哪个资源的哪个实例具体有什么操作,冒号是
-
5.3 Shiro中授权编程实现方式
-
编程式
Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")){ //有权限 }else{ //无权限 } System.out.println("权限:"+subject.isPermitted("user:*:*"));
//授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String primaryPrincipal = (String) principals.getPrimaryPrincipal(); //根据 primaryPrincipal 用户名 获取当前用户的角色信息,以及权限信息 //将数据库中查询的角色信息赋予权限对象,这里用假数据进行模拟 SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); simpleAuthorizationInfo.addRole("admin"); simpleAuthorizationInfo.addRole("user"); //在数据库查询权限信息赋予权限对象 simpleAuthorizationInfo.addStringPermission("user:*:01"); return simpleAuthorizationInfo; }
-
注解式
@RequiresRoles("admin") public void hello(){ //有权限 }
-
标签式
由于jsp使用已少,故没有书写...