Shiro入门视频课程——笔记(二)

视频课程链接: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

​ 步骤:

  1. 注册时将密码加密后再存储

  2. 为JdbcRealm注入一个密码匹配器

    #配置密码匹配器
    credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
    credentialsMatcher.hashAlgorithmName=md5
    #将密码匹配器注入到JdbcRealm中
    jdbcRealm.credentialsMatcher=$credentialsMatcher

3.3 带salt加密的JdbcRealm

​ 步骤:

  1. 注册时将密码加密(带salt、散列次数)后再存储

  2. 自定义JdbcSaltRealm

    由于无法直接通过JdbcRealm注入saltStyle

    public class JdbcSaltRealm extends JdbcRealm {
    
       //修改saltStyle的值为column
       public JdbcSaltRealm() {
           setSaltStyle(SaltStyle.COLUMN);
       }
    }
  3. 配置密码匹配器

七、授权

1. 简介

​ 授权,也叫访问控制,控制用户对资源的访问

  • 权限:增删改查 CRUD
  • 角色:权限的集合,如系统管理员、老师、学生

2. 系统权限表结构

Shiro入门视频课程——笔记(二)

3. 授权流程图

Shiro入门视频课程——笔记(二)

执行过程,分为四步:

  • 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 表结构

Shiro入门视频课程——笔记(二)

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. 搭建环境

  1. 配置SSM环境
  2. 实现用户注册,明文保存密码

2. 密文存储密码

3. 实现用户登陆(整合Shiro)

​ 步骤:

  1. 添加jar包

    <dependency>
     <groupId>org.apache.shiro</groupId>
     <artifactId>shiro-web</artifactId>
    </dependency>
    <dependency>
     <groupId>org.apache.shiro</groupId>
     <artifactId>shiro-spring</artifactId>
    </dependency>
  2. 配置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>
  3. 定义一个名为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. 实现角色和权限验证(授权)

​ 一、角色验证的步骤:

  1. 添加url过滤规则

    /teacher/**=authc,roles[teacher]
    /student/**=authc,roles[student]
  2. 重写角色验证的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>
  3. 重写角色验证失败页面,默认显示错误码401

    <!-- 重写角色验证失败页面,默认显示错误码401 -->
    <property name="unauthorizedUrl" value="/401.jsp"/>

    ​二、角色验证的步骤:

九、Shiro标签库

​ 步骤:

  1. 导入标签库
  2. 使用标签

猜你喜欢

转载自blog.51cto.com/12402007/2155010