视频课程链接:http://edu.51cto.com/course/14122.html
六、加密
1. 编码/解码
Shiro 提供了base64和16进制字符串编码/解码的API支持
2. 散列算法
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的
数据,常见的散列算法如MD5、SHA等
一般进行散列加密时都会提供一个salt,加一些干扰数据,同时可以指定散列次数
3. 加密和验证服务
3.1 简介
Shiro 提供了PasswordService及CredentialsMatcher用于提供加密密码及验证密码服务。
-
PasswordService
用于对明文进行加密,得到密文
实现类:
DefaultPasswordService
自定义密码服务实现类
-
CredentialsMatcher
密码匹配器
实现类:
SimpleCredentialsMatcher 默认的密码匹配器,直接判断是否相同
HashedCredentialsMatcher 散列密码匹配器,会对用户输入的明文密码先进行加密,然后再与数据源中的密文密码进行匹配判断
3.2 加密的JdbcRealm
步骤:
-
注册时将密码加密后再存储
-
为JdbcRealm注入一个密码匹配器
#配置密码匹配器 credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher credentialsMatcher.hashAlgorithmName=md5 #将密码匹配器注入到JdbcRealm中 jdbcRealm.credentialsMatcher=$credentialsMatcher
3.3 带salt加密的JdbcRealm
步骤:
-
注册时将密码加密(带salt、散列次数)后再存储
-
自定义JdbcSaltRealm
由于无法直接通过JdbcRealm注入saltStyle
public class JdbcSaltRealm extends JdbcRealm { //修改saltStyle的值为column public JdbcSaltRealm() { setSaltStyle(SaltStyle.COLUMN); } }
- 配置密码匹配器
七、授权
1. 简介
授权,也叫访问控制,控制用户对资源的访问
- 权限:增删改查 CRUD
- 角色:权限的集合,如系统管理员、老师、学生
2. 系统权限表结构
3. 授权流程图
执行过程,分为四步:
-
Subject
发送请求
-
SecurityManager
接收请求,委托给Authorizer
-
Authorizer
授权器
-
Realm
查询角色和权限信息
4. 用法
4.1 基本角色的授权
在INI配置文件中用户角色的配置规则:
#用户名=密码,角色1,角色2...
[users]
admin=123,manager,teacher
tom=456,student
4.2 基于权限的授权
也称为基于资源的授权
在INI配置文件中角色权限的配置规则:角色=权限1,权限2...
其中权限的配置规则:资源标识符:操作:实例ID
,表示对哪个资源的哪个实例可以进行什么操作
user:update:1
product:insert:2
user:view:* 简写为 user:view
user:*:* 简写为 user 或 user:*(推荐)
*:insert:* 简写为 *:insert
user:insert,product:view
#角色=权限1,权限2...(资源:操作:实例ID)
[roles]
manager=manager:*
teacher=teacher:*,student:view
student=student:*
5. 基于JdbcRealm的配置
5.1 表结构
5.2 基于角色的授权
#重写角色的sql
jdbcRealm.userRolesQuery=select r.role_name from t_user u left join t_user_role ur on u.id=ur.user_id left join t_role r on ur.role_id=r.id where u.login_name=?
5.3 基于权限的授权
需要启用权限查找,设置permissionsLookupEnabled
#启用权限查找
jdbcRealm.permissionsLookupEnabled=true
#重写权限的sql
jdbcRealm.permissionsQuery=select p.permission_name from t_role r left join t_role_permission rp on r.id=rp.role_id left join t_permission p on rp.permission_id=p.id where r.role_name=?
八、Spring整合Shiro
1. 搭建环境
- 配置SSM环境
- 实现用户注册,明文保存密码
2. 密文存储密码
3. 实现用户登陆(整合Shiro)
步骤:
-
添加jar包
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> </dependency>
-
配置Shiro过滤器
<!-- 配置Shiro过滤器,用来拦截请求,进行认证和授权 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <!-- 将当前的Filter的生命周期将由web容器管理 --> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 定义一个名为shiroFilter的bean,Shiro拦截请求后会将交由该bean处理
4. 实现登陆验证(身份认证)
应用场景:有些url的访问需要登陆,未登陆时不允许访问,此时跳转到登陆页面
解决:配置url过滤规则
Shiro提供的默认过滤规则有11个,常用的有4个:
- anon(AnonymousFilter.class) 不需要验证
- authc(FormAuthenticationFilter.class) 需要登陆验证
- perms(PermissionsAuthorizationFilter.class) 需要权限验证
- roles(RolesAuthorizationFilter.class) 需要角色验证
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!-- url过滤规则 -->
<property name="filterChainDefinitions">
<value>
/showLogin=anon
/showRegist=anon
/user/*=authc
/product/*=authc
</value>
</property>
<!-- 重写默认的登陆失败页面,默认为/login.jsp -->
<property name="loginUrl" value="/showLogin"/>
</bean>
5. 实现角色和权限验证(授权)
一、角色验证的步骤:
-
添加url过滤规则
/teacher/**=authc,roles[teacher] /student/**=authc,roles[student]
-
重写角色验证的sql
<!-- 重写角色验证的sql --> <property name="userRolesQuery"> <value> select r.role_name from t_user u left join t_user_role ur on u.id=ur.user_id left join t_role r on ur.role_id=r.id where u.login_name=? </value> </property>
-
重写角色验证失败页面,默认显示错误码401
<!-- 重写角色验证失败页面,默认显示错误码401 --> <property name="unauthorizedUrl" value="/401.jsp"/>
二、角色验证的步骤:
九、Shiro标签库
步骤:
- 导入标签库
- 使用标签