Shiro
用户授权指验证某个用户是否有权限执行某个操作。
 一般来说,系统会为不同的用户分配不同的角色,而每个角色对应一系列权限。
1.什么是Shiro
Shiro是apache的一个开源框架,将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权,加密,会话管理等,组成一个通用的安全认证框架。
 
1.1 Shiro模块内容具体意义
- Subject
 
即“当前操作用户”,不仅指“人”,也可以是“第三方进程”、“后台账户”。仅仅意味“当前跟软件交互的东西”。
Subject代表当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
- SecurityManager
 
shiro框架的核心,shiro通过SecurityManager来管理内部组件实例,并通过它提供安全管理的各种服务。
- Realm
 
Realm是Shiro与应用安全数据 间的“桥梁”或者“连接器”。
 
1.2 Shiro中的认证
1.2.1 认证
 身份认证,就是判断一个用户是否为合法用户的处理过程。
 1.2.2 shiro中认证的关键对象
- Subject 主体
访问系统的用户,主体可以是用户、进程等,即进行认证的都称为主体。 - Principal 身份信息
是主体Subject进行身份认证的标识,标识具有唯一性,如用户名、手机号、邮箱等。一个主体可以有多个身份,但必须有一个主身份。
credential:凭证信息
是主体自己知道的安全信息,如:密码、证书等。 
1.3 认证流程图

2.Shiro入门demo
先创建一个maven项目。
 
2.1 导shiro的jar包
	<dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.5.3</version>
    </dependency>
    <!--必須要,不然日志文件報錯-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.25</version>
      <scope>test</scope>
    </dependency>
 
2.2 扫描路径
	<!--等下的ini文件直接放resources,这是指明路径-->
    <resources>
      <resource>
        <directory>/src/main/resources</directory>
      </resource>
    </resources>
 
2.3 创建ini文件

 
 这个文件编码格式为:UTF-8、ANSI。
2.4 测试类shiroTest
public class TestShiro {
    public static void main(String[] args) {
        System.out.println("shiro简单入门测试------");
        //1.创建安全管理器对象
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        //2.给安全管理器对象设置realm(引入安全数据的文件)
        //就是把自己定义好的realm文件加进来,用来验证规则,就加入到我们的安全管理器中
        defaultSecurityManager.setRealm(new IniRealm("classpath:shiro.ini"));
        //3.安全工具设置安全管理器
        //即把安全管理器加入到安全工具中去
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        //4.通过安全工具获取用户主体   主体可以使scanner传入的,也可以页面传入的
        Subject subject = SecurityUtils.getSubject();
        //------------------以上相当于我们的后端验证
        //把配置文件上的用户信息获取出来放入令牌中
        //5.这个就是我们的令牌(里面带着我们的信息)   即相当于前端传过来的信息
        UsernamePasswordToken token = new UsernamePasswordToken("yty","123123");
        //目前安全管理器里的信息和第5步中的令牌的信息 没有 联系在一起
        System.out.println("没有认证之前。。。。。。。");
        System.out.println(subject.isAuthenticated());//判断subject有没有认证
        //只需要一个subject.login(token);即可联系起来
        //开始认证
        System.out.println("进行认证-----------");
        subject.login(token);
        System.out.println(subject.isAuthenticated());
    }
}
 
结果:
 
 如果传过来的密码和ini文件密码不一致就会报错。
 
 密码不一致,报错!
 










