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

视频课程链接:http://edu.51cto.com/course/14122.html

Shiro权限框架,主讲:汤小洋

一、Shiro简介

1. 什么是Shiro

​ Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。

2. 基本功能

​ 身份认证、授权、加密、会话管理

3. 单词

​ authentication 身份认证

​ authorization 授权

​ strategy 策略

二、身份认证

1. 认证流程图

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

2. 执行过程

​ 分为五步:

  • Subject

    用户主体:请求的发起者,即访问应用的用户

  • SecurityManager

    安全管理器:Shiro的核心,用来分发请求

  • Authenticator

    认证器:用来进行认证操作

  • Authentication Strategy

    认证策略,针对多个Realm

  • Realm

    安全数据源:用来进行数据匹配的,可以通过多种数据源进行匹配认证,如文件、数据库、QQ、微信、手机号等

三、第一个Shiro程序

​ 登陆和退出

1. 添加jar包

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-core</artifactId>
  <version>${shiro-core.version}</version>
</dependency>
<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.21</version>
</dependency>

2. 核心配置文件

​ Shiro使用的是INI格式的配置文件,键值对的配置,可以分类进行配置

#配置用户信息
[users]
admin=123
tom=456

3. 用法

public static void main(String[] args) {
  //1.获取SecurityManager,指定配置文件初始化
  Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro01/shiro.ini");
  SecurityManager securityManager = factory.getInstance();

  //2.对securityManager进行封装,绑定给SecurityUtils
  SecurityUtils.setSecurityManager(securityManager);

  //3.获取用户主体Subject
  Subject subject = SecurityUtils.getSubject();

  //4.登陆
  System.out.println("是否认证:"+subject.isAuthenticated());
  UsernamePasswordToken token = new UsernamePasswordToken("admin", "456");
  try {
    subject.login(token);
  } catch(UnknownAccountException e){
    System.out.println("未知的账户!e:"+e.getMessage());
  } catch (IncorrectCredentialsException e){
    System.out.println("错误的密码!e:"+e.getMessage());
  } catch (AuthenticationException e) {
    System.out.println("认证异常!e:"+e.getMessage());
  }

  System.out.println("是否认证:"+subject.isAuthenticated());

  //5.退出
  subject.logout();

  System.out.println("是否认证:"+subject.isAuthenticated());
}

4. 默认的配置

#默认的SecurityManager
securityManager=org.apache.shiro.mgt.DefaultSecurityManager

#默认的认证器
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
securityManager.authenticator=$authenticator

#默认的认证策略
authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
authenticator.authenticationStrategy=$authenticationStrategy

#默认的Realm
iniRealm=org.apache.shiro.realm.text.IniRealm
securityManager.realms=$iniRealm

四、Realm

​ 默认有三种Realm:IniReaml、JdbcRealm、PropertiesRealm

1. 使用JdbcRealm

#配置数据源
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/shiro?useUnicode=true&characterEncoding=utf8
dataSource.username=root

#使用JdbcRealm
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
#重写认证的查询语句
jdbcRealm.authenticationQuery=select password from t_user where login_name=?

securityManager.realms=$jdbcRealm

2. 自定义Realm

​ 步骤:

  1. 自定义一个类,实现Realm接口,或继承AuthorizingRealm父类
  2. 配置shiro.ini

五、认证策略

1. 简介

​ 针对多个Realm,可以对认证Realm的个数进行配置

​ 三种认证策略:

  • AtLeastOneSuccessfulStrategy 默认

    只要有一个Realm验证成功即可,返回所有Realm身份验证成功的认证信息

  • FirstSuccessfulStrategy

    只要有一个Realm验证成功即可,返回第一个Realm身份认证成功的认证信息

  • AllSuccessfulStrategy

    所有Realm都验证成功才算成功

注:三种认证策略都会对所有Realm进行匹配

2. 用法

#认证策略
#authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
#authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy
authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy

#认证器
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
authenticator.authenticationStrategy=$authenticationStrategy

securityManager.authenticator=$authenticator

securityManager.realms=$propertiesRealm,$jdbcRealm

猜你喜欢

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