-
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实现。
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授权过程与认证过程基本一致)
- <code class="language-java">package com.imooc.test;
- import org.apache.shiro.SecurityUtils;
- import org.apache.shiro.authc.AuthenticationToken;
- import org.apache.shiro.authc.UsernamePasswordToken;
- import org.apache.shiro.mgt.DefaultSecurityManager;
- import org.apache.shiro.realm.SimpleAccountRealm;
- import org.apache.shiro.subject.Subject;
- import org.junit.Before;
- import org.junit.Test;
- /**
- * @auther xiehuaxin
- * @create 2018-07-02 14:06
- * @todo 创建一个测试类,测试认证
- */
- public class AuthenticationTest {
- SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
- @Before
- public void addUser() {
- //添加用户的时候为此用户添加角色,一个用户可以拥一个或多个角色
- simpleAccountRealm.addAccount("xiehuaxin", "123456", "admin", "user");
- }
- @Test
- public void testAutentication() {
- //1.构建Security Manager环境(Security Manager是用来提供安全服务的,所以在做shiro认证的时候要先创建此对象,创建Security Manager对象之后要设置Realm)
- DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
- defaultSecurityManager.setRealm(simpleAccountRealm);
- //2.获取向Security Manager提交请求的subject,而主体subject可以通过shiro提供的一个工具类SecurityUtils来获取
- SecurityUtils.setSecurityManager(defaultSecurityManager);//使用SecurityUtils之前要设置Security Manager环境
- Subject subject = SecurityUtils.getSubject();
- //3.主体Subject提交请求给Security Manager --> subject.login(token);
- UsernamePasswordToken token = new UsernamePasswordToken("xiehuaxin", "123456");//提交请求时需要一个token,所以要先创建token
- subject.login(token);
- //4. shiro提供了一个检查主体subject是否认证的方法isAuthenticated(),此方法的返回结果是一个boolean值
- System.out.println(subject.isAuthenticated());
- //校验角色
- <span style="color:#ff0000;">subject.checkRoles("admin");</span>
- }
- }</code>
七、Shiro自定义Realm
- <code class="language-java">package com.imooc.test;
- import com.alibaba.druid.pool.DruidDataSource;
- import org.apache.shiro.SecurityUtils;
- import org.apache.shiro.authc.UsernamePasswordToken;
- import org.apache.shiro.mgt.DefaultSecurityManager;
- import org.apache.shiro.realm.jdbc.JdbcRealm;
- import org.apache.shiro.subject.Subject;
- import org.junit.Test;
- /**
- * @auther xiehuaxin
- * @create 2018-07-02 15:16
- * @todo
- */
- public class JdbcRealmTest {
- DruidDataSource dataSource = new DruidDataSource();
- {
- dataSource.setUrl("jdbc:mysql://localhost:3306/test");
- dataSource.setUsername("root");
- dataSource.setPassword("123123");
- }
- @Test
- public void testAutentication() {
- //1.创建jdbcReaml对象
- JdbcRealm jdbcRealm = new JdbcRealm();
- //2.设置数据源
- jdbcRealm.setDataSource(dataSource);
- //这里需要注意的是,在使用JdbcRealm的时候要设置权限的开关,只有设置为true时才会去查询权限数据
- jdbcRealm.setPermissionsLookupEnabled(true);
- //使用自定义的表/sql
- String sql = "select password from test_user where user_name = ?";
- jdbcRealm.setAuthenticationQuery(sql);
- String roleSql = "select role_name from test_user_role where user_name = ?";
- jdbcRealm.setUserRolesQuery(roleSql);
- //1.构建Security Manager环境(Security Manager是用来提供安全服务的,所以在做shiro认证的时候要先创建此对象,创建Security Manager对象之后要设置Realm)
- DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
- defaultSecurityManager.setRealm(jdbcRealm);
- //2.获取向Security Manager提交请求的subject,而主体subject可以通过shiro提供的一个工具类SecurityUtils来获取
- SecurityUtils.setSecurityManager(defaultSecurityManager);//使用SecurityUtils之前要设置Security Manager环境
- Subject subject = SecurityUtils.getSubject();
- //3.主体Subject提交请求给Security Manager --> subject.login(token);
- UsernamePasswordToken token = new UsernamePasswordToken("xiehuaxin","123456");//提交请求时需要一个token,所以要先创建token
- subject.login(token);
- // 4. shiro提供了一个检查主体subject是否认证的方法isAuthenticated(),此方法的返回结果是一个boolean值
- System.out.println(subject.isAuthenticated());
- }}</code>
八、自定义Realm
九、Shiro的加密