转一位dalao的微博。以供自己学习

Posted on 2019-05-07 08:56  Devilネリエル大好き  阅读(148)  评论(0编辑  收藏  举报

shiro

(java安全框架)

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
主要功能
三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
  Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
  SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
  从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
  Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
************************************************************以上内容来自百度百科**************************************************************

 

一、学习目标

 

 

 

 

 

 

 

二、shiro安全框架的简介

 

 

 

三、shiro与spring Security的比较(spring的官网也是用shiro做安全管理的)

 

 

 

四、Shiro的整体架构(下图来自慕课视频截图也是shiro官网提供的整体架构图)

 

 

 

 

 

五、Shiro的认证

 

 

 

 

 

 

    

 

 

六、Shiro的授权(shiro授权过程与认证过程基本一致)

 

 

 

 

 

 

  1. <code class="language-java">package com.imooc.test;  
  2.   
  3. import org.apache.shiro.SecurityUtils;  
  4. import org.apache.shiro.authc.AuthenticationToken;  
  5. import org.apache.shiro.authc.UsernamePasswordToken;  
  6. import org.apache.shiro.mgt.DefaultSecurityManager;  
  7. import org.apache.shiro.realm.SimpleAccountRealm;  
  8. import org.apache.shiro.subject.Subject;  
  9. import org.junit.Before;  
  10. import org.junit.Test;  
  11.   
  12.   
  13. /** 
  14.  * @auther xiehuaxin 
  15.  * @create 2018-07-02 14:06 
  16.  * @todo 创建一个测试类,测试认证 
  17.  */  
  18. public class AuthenticationTest {  
  19.   
  20.     SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();  
  21.   
  22.     @Before  
  23.     public void addUser() {  
  24.         //添加用户的时候为此用户添加角色,一个用户可以拥一个或多个角色  
  25.         simpleAccountRealm.addAccount("xiehuaxin", "123456", "admin", "user");  
  26.     }  
  27.   
  28.     @Test  
  29.     public void testAutentication() {  
  30.         //1.构建Security Manager环境(Security Manager是用来提供安全服务的,所以在做shiro认证的时候要先创建此对象,创建Security Manager对象之后要设置Realm)  
  31.         DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();  
  32.         defaultSecurityManager.setRealm(simpleAccountRealm);  
  33.         //2.获取向Security Manager提交请求的subject,而主体subject可以通过shiro提供的一个工具类SecurityUtils来获取  
  34.         SecurityUtils.setSecurityManager(defaultSecurityManager);//使用SecurityUtils之前要设置Security Manager环境  
  35.         Subject subject = SecurityUtils.getSubject();  
  36.         //3.主体Subject提交请求给Security Manager -->  subject.login(token);  
  37.         UsernamePasswordToken token = new UsernamePasswordToken("xiehuaxin", "123456");//提交请求时需要一个token,所以要先创建token  
  38.         subject.login(token);  
  39.         //4. shiro提供了一个检查主体subject是否认证的方法isAuthenticated(),此方法的返回结果是一个boolean值  
  40.         System.out.println(subject.isAuthenticated());  
  41.   
  42.         //校验角色  
  43.         <span style="color:#ff0000;">subject.checkRoles("admin");</span>  
  44.     }  
  45. }</code>  

 

七、Shiro自定义Realm

 

 

 

            

 

 

  1. <code class="language-java">package com.imooc.test;  
  2.   
  3. import com.alibaba.druid.pool.DruidDataSource;  
  4. import org.apache.shiro.SecurityUtils;  
  5. import org.apache.shiro.authc.UsernamePasswordToken;  
  6. import org.apache.shiro.mgt.DefaultSecurityManager;  
  7. import org.apache.shiro.realm.jdbc.JdbcRealm;  
  8. import org.apache.shiro.subject.Subject;  
  9. import org.junit.Test;  
  10.   
  11. /** 
  12.  * @auther xiehuaxin 
  13.  * @create 2018-07-02 15:16 
  14.  * @todo 
  15.  */  
  16. public class JdbcRealmTest {  
  17.   
  18.     DruidDataSource dataSource = new DruidDataSource();  
  19.   
  20.     {  
  21.         dataSource.setUrl("jdbc:mysql://localhost:3306/test");  
  22.         dataSource.setUsername("root");  
  23.         dataSource.setPassword("123123");  
  24.     }  
  25.   
  26.     @Test  
  27.     public void testAutentication() {  
  28.         //1.创建jdbcReaml对象  
  29.         JdbcRealm jdbcRealm = new JdbcRealm();  
  30.         //2.设置数据源  
  31.         jdbcRealm.setDataSource(dataSource);  
  32.          //这里需要注意的是,在使用JdbcRealm的时候要设置权限的开关,只有设置为true时才会去查询权限数据  
  33.         jdbcRealm.setPermissionsLookupEnabled(true);  
  34.         //使用自定义的表/sql  
  35.         String sql = "select password from test_user where user_name = ?";  
  36.         jdbcRealm.setAuthenticationQuery(sql);  
  37.         String roleSql = "select role_name from test_user_role where user_name = ?";  
  38.         jdbcRealm.setUserRolesQuery(roleSql);  
  39.   
  40.   
  41.         //1.构建Security Manager环境(Security Manager是用来提供安全服务的,所以在做shiro认证的时候要先创建此对象,创建Security Manager对象之后要设置Realm)  
  42.         DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();  
  43.         defaultSecurityManager.setRealm(jdbcRealm);  
  44.         //2.获取向Security Manager提交请求的subject,而主体subject可以通过shiro提供的一个工具类SecurityUtils来获取  
  45.         SecurityUtils.setSecurityManager(defaultSecurityManager);//使用SecurityUtils之前要设置Security Manager环境  
  46.         Subject subject = SecurityUtils.getSubject();   
  47.         //3.主体Subject提交请求给Security Manager --> subject.login(token);  
  48.         UsernamePasswordToken token = new UsernamePasswordToken("xiehuaxin","123456");//提交请求时需要一个token,所以要先创建token   
  49.         subject.login(token);  
  50.         // 4. shiro提供了一个检查主体subject是否认证的方法isAuthenticated(),此方法的返回结果是一个boolean值  
  51.         System.out.println(subject.isAuthenticated());  
  52.     }}</code>  

 

 

 

八、自定义Realm

 

 

 

 

九、Shiro的加密