• shrio初体验(2)Realm


    Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。如我们之前的ini配置方式将使用org.apache.shiro.realm.text.IniRealm。

    org.apache.shiro.realm.Realm接口如下: 

    Java代码  
    1. String getName(); //返回一个唯一的Realm名字  
    2. boolean supports(AuthenticationToken token); //判断此Realm是否支持此Token  
    3. AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)  
    4.  throws AuthenticationException;  //根据Token获取认证信息  

    Realm配置

    1、自定义Realm实现(com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1):  

    Java代码  
    1. public class MyRealm1 implements Realm {  
    2.     @Override  
    3.     public String getName() {  
    4.         return "myrealm1";  
    5.     }  
    6.     @Override  
    7.     public boolean supports(AuthenticationToken token) {  
    8.         //仅支持UsernamePasswordToken类型的Token  
    9.         return token instanceof UsernamePasswordToken;   
    10.     }  
    11.     @Override  
    12.     public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  
    13.         String username = (String)token.getPrincipal();  //得到用户名  
    14.         String password = new String((char[])token.getCredentials()); //得到密码  
    15.         if(!"zhang".equals(username)) {  
    16.             throw new UnknownAccountException(); //如果用户名错误  
    17.         }  
    18.         if(!"123".equals(password)) {  
    19.             throw new IncorrectCredentialsException(); //如果密码错误  
    20.         }  
    21.         //如果身份认证验证成功,返回一个AuthenticationInfo实现;  
    22.         return new SimpleAuthenticationInfo(username, password, getName());  
    23.     }  
    24. }   

    2、ini配置文件指定自定义Realm实现(shiro-realm.ini)  

    Java代码  
    1. #声明一个realm  
    2. myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1  
    3. #指定securityManager的realms实现  
    4. securityManager.realms=$myRealm1   

    通过$name来引入之前的realm定义

    3、测试用例请参考com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testCustomRealm测试方法,只需要把之前的shiro.ini配置文件改成shiro-realm.ini即可。

    Realm配置

    1、ini配置文件(shiro-multi-realm.ini)  

    Java代码  
    1. #声明一个realm  
    2. myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1  
    3. myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2  
    4. #指定securityManager的realms实现  
    5. securityManager.realms=$myRealm1,$myRealm2   

    securityManager会按照realms指定的顺序进行身份认证。此处我们使用显示指定顺序的方式指定了Realm的顺序,如果删除“securityManager.realms=$myRealm1,$myRealm2”,那么securityManager会按照realm声明的顺序进行使用(即无需设置realms属性,其会自动发现),当我们显示指定realm后,其他没有指定realm将被忽略,如“securityManager.realms=$myRealm1”,那么myRealm2不会被自动设置进去。

    2、测试用例请参考com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testCustomMultiRealm测试方法。

    Shiro默认提供的Realm

    以后一般继承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;

    JDBC Realm使用

    1、数据库及依赖

    Java代码  
    1. <dependency>  
    2.     <groupId>mysql</groupId>  
    3.     <artifactId>mysql-connector-java</artifactId>  
    4.     <version>5.1.25</version>  
    5. </dependency>  
    6. <dependency>  
    7.     <groupId>com.alibaba</groupId>  
    8.     <artifactId>druid</artifactId>  
    9.     <version>0.2.23</version>  
    10. </dependency>   

    本文将使用mysql数据库及druid连接池; 

    2、到数据库shiro下建三张表:users(用户名/密码)、user_roles(用户/角色)、roles_permissions(角色/权限),具体请参照shiro-example-chapter2/sql/shiro.sql;并添加一个用户记录,用户名/密码为zhang/123;

    3、ini配置(shiro-jdbc-realm.ini) 

    Java代码  
    1. jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm  
    2. dataSource=com.alibaba.druid.pool.DruidDataSource  
    3. dataSource.driverClassName=com.mysql.jdbc.Driver  
    4. dataSource.url=jdbc:mysql://localhost:3306/shiro  
    5. dataSource.username=root  
    6. #dataSource.password=  
    7. jdbcRealm.dataSource=$dataSource  
    8. securityManager.realms=$jdbcRealm   

    1、变量名=全限定类名会自动创建一个类实例

    2、变量名.属性=值 自动调用相应的setter方法进行赋值

    3、$变量名 引用之前的一个对象实例 

    4、测试代码请参照com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testJDBCRealm方法,和之前的没什么区别。

  • 相关阅读:
    数据结构与算法-字符串与字符串匹配算法
    操作系统-PV操作的原理和几种常见问题
    操作系统-进程(8)-临界区管理
    利用队列实现逐行打印杨辉三角形的前n行
    操作系统-进程(7)死锁和银行家算法
    计算机网络-网络层(6)ICMP协议
    操作系统-进程(6)管程
    计算机网络-链路层(5)点对点链路控制
    操作系统-进程(5)进程通信机制
    RTSP/RTMP流媒体协议网页无插件直播视频平台浏览器请求地址自带尾缀符解释说明
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/6207998.html
Copyright © 2020-2023  润新知