• Shiro学习笔记总结,附加" 身份认证 "源码案例(一)


    Shiro学习笔记总结

     内容介绍:

        一、Shiro介绍    

        二、subject认证主体

        三、身份认证流程

        四、Realm & JDBC reaml介绍

        五、Shiro.ini配置介绍

        六、源码案例 ,链接数据库测试

        Apache Shiro™是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速,轻松地确保任何应用程序 - 从最小的移 动应用程序到最大的Web和企业应用程序。

    一、subject认证主体

      subject:认证主体包含两个信息:

        principals:身份,可以是用户名,邮件,手机号邓,用来标志一个登入主体身份

        Cresentials:凭证,常见有密码,数字证书等

    二、身份认证流程

           Step1:应用程序代码在调用Subject.login(token)方法后,传入代表最终用户的身份和凭证构造的AuthenticationToken实例token。

     
      Step2:将Subject实例委托给应用程序的SecurityManager(Shiro的安全管理)通过调用securityManager.login(token)来开始实际的认证工作。这里开始真正的认证工了。 
      

        Step3,4,5:然后SecurityManager就会根据具体的reaml去进行安全认证了。 


      这个realm到底是啥呢?realm就是一个域,Shiro就是从realm中获取验证数据的,也就是我们写在.ini文件中的东西,当然了,这个realm有很多种,如text realm、jdbc realm、jndi realm等,text realm比较简单,这一节主要总结一下jdbc realm的使用,text realm也会提到。

    三、Realm & JDBC reaml

      Realm 意思是域,shiro从Realm 中获取验证数据

      Realm 很多种类,常见有jdbc Realm ,jndi Realm ,text Realm 

    Shiro默认提供的Reaml说明:

      关于说明是Reaml看前面的说明,Shiro默认提供的Reaml说明如下:

            一般继承AuthorizingRealm(授权)即可;其继承了AuthenticatingRealm(即身份验证),而且也间接继承了CachingRealm(带有缓存实现)。其中主要默认实现如下:

      org.apache.shiro.realm.text.IniRealm:[users]部分指定用户名/密码及其角色;[roles]部分指定角色即权限信息;

      org.apache.shiro.realm.text.PropertiesRealm: user.username=password,role1,role2指定用户名/密码及其角色;role.role1=permission1,permission2指定角色及权限信息;

      org.apache.shiro.realm.jdbc.JdbcRealm:通过sql查询相应的信息,如“select password from users where username = ?”获取用户密码,“select password, password_salt from users   where username = ?”获取用户密码及盐;“select role_name from user_roles where username = ?”获取用户角色;“select permission from roles_permissions where role_name = ?”获取 角对应的权限信息;也可以调用相应的api进行自定义sql;

    INI配置文件介绍

      INI配置文件是一种key/value的键值对配置,提供了分类的概念,每一个类中的key不可重复;

      #号代表注释,shiro.ini文件默认在/WEB-INF/ 或classpath下,shiro会自动查找;

      INI配置文件一般适用于用户少且不需要在运行时动态创建的情景下使用。

    1.在web.xml中配置shiro的过滤器

    要使用Shiro必须在web.xml中配置shiro,在web.xml 中自定义shiro.ini位置(默认位置)/WEB-INF/shiro.ini or classpath:shiro.ini, 加入以下内容:

        <filter-name>ShiroFilter</filter-name>  
        <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>  
        <init-param>  
            <param-name>configPath</param-name>  
            <param-value>/WEB-INF/shiro.ini</param-value>  
        </init-param>  
    </filter>  

    2. shiro.ini简单示例(ini配置中主要配置有四大类:main,users,roles,urls,这儿先介绍下main,其他三个后面介绍)

    [main]
    jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
    dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
    #数据库驱动
    dataSource.driverClass=com.mysql.jdbc.Driver
    #数据库名
    dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
    #数据库登入名 其中user是包里的固定写法
    dataSource.user=root
    #数据库密码
    dataSource.password=123456
    #设置数据源
    jdbcRealm.dataSource=$dataSource
    securityManager.realms=$jdbcRealm

    源码案例 ,链接数据库测试

    整体结构如下图:

        

    先导入jar包,我用的是maven环境,看详情:

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     2   <modelVersion>4.0.0</modelVersion>
     3   <groupId>com.java123.shiro</groupId>
     4   <artifactId>Shior001</artifactId>
     5   <version>0.0.1-SNAPSHOT</version>
     6   <name>Shiro001</name>
     7   <build/>
     8   <!-- 自动下载jar配置到本地仓库 maven Dependcies  -->
     9   <dependencies>
    10       <dependency>
    11           <groupId>org.apache.shiro</groupId>
    12           <artifactId>shiro-core</artifactId>
    13           <version>1.2.4</version>
    14       </dependency>
    15        <!-- 下载jar包 -->
    16     <dependency>
    17         <groupId>org.slf4j</groupId>
    18         <artifactId>slf4j-log4j12</artifactId>
    19         <version>1.7.12</version>
    20     </dependency>
    21     
    22     <!-- 下载同上 -->
    23      <dependency>
    24         <groupId>c3p0</groupId>
    25         <artifactId>c3p0</artifactId>
    26         <version>0.9.1.2</version>
    27     </dependency>
    28     
    29      <dependency>
    30         <groupId>c3p0</groupId>
    31         <artifactId>c3p0</artifactId>
    32         <version>0.9.1.2</version>
    33     </dependency>
    34     
    35     <dependency>
    36         <groupId>commons-logging</groupId>
    37         <artifactId>commons-logging</artifactId>
    38         <version>1.2</version>
    39     </dependency>
    40     
    41     <!-- mysql的驱动包 -->
    42     <dependency>
    43         <groupId>mysql</groupId>
    44         <artifactId>mysql-connector-java</artifactId>
    45         <version>5.1.37</version>
    46     </dependency>
    47     
    48   </dependencies>
    49 </project>

    之后会自动生成jar包文件

        

    然后编写shiro.xm配置文件,代码参见shior.xml文件详解,再引入log4g文件,以便查看信息

    最后写一个测试类,查看折叠代码

    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    
    
    public class JdbcRealm {
    
        public static void main(String[] args) {
            
            //读取配置文件,初始化工厂
            Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
        
            //获取SecurityManager实例
            SecurityManager secManager=factory.getInstance();
            
            //把secManager绑定到SecurityUtils中
            SecurityUtils.setSecurityManager(secManager);;
            
            //得到当前执行的用户
            Subject subject=SecurityUtils.getSubject();
        
            //创建token令牌,用户名和密码
            //其中"java1234","123456"是写死的,与shiro.ini里面的一致
            UsernamePasswordToken token=new UsernamePasswordToken("java1234","123456");
            
            try {
                subject.login(token); //身份异常处理
                System.out.println("身份登入成功");
            } catch (AuthenticationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("身份登入失败");
            }
            //Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录  
            //退出
            subject.logout();
        }
    }

    最后看看运行结果:

    自学到这,分享出来。希望对入门的朋友也有用,技术交流,欢迎添加(QQ:1030570138)

    后续...

  • 相关阅读:
    linux service 例子
    YII2自动初始化脚本
    ubuntu 如何在命令行打开当前目录
    mysql 储存过程
    Mysql 随笔记录
    Lack of free swap space on Zabbix server
    意外发现PHP另一个显示转换类型 binary
    常用的排序代码
    线程的实现方式之内核支持线程和用户级线程
    寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)
  • 原文地址:https://www.cnblogs.com/dqh94/p/7466242.html
Copyright © 2020-2023  润新知