shiro 介绍
Apache Shiro 是一个强大且易用的java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro 的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用到最大的网络和企业应用程序。
主要功能
三个核心组件:Subject、SecurityManger 和 Realms
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。 Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager:它是Shiro框架的核心,典型的Facade模式,S hiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。 Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。 从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。 Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
SpringBoot 集成 Shiro
创建Shiro环境
创建一个普通SpringBoot的Web工程01-Shiro添加依赖包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
配置Shiro
定义类com.shoro.config.ShiroConfig
//标记当前类是一个Spring的配置类,用于模拟Spring的配置文件 //在这里我们将要配置Shiro @Configuration public class ShiroConfig { //配置Shiro的安全管理器 @Bean public SecurityManager securityManager(Realm myRealm){ DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager(); //设置一个Realm,这个Realm是最终用于完成我们的认证号和授权操作的具体对象 securityManager.setRealm(myRealm); return securityManager; } //配置一个自定义的Realm的bean,最终将使用这个bean返回的对象来完成我们的认证和授权 @Bean public Realm myRealm(){ MyRealm realm=new MyRealm(); return realm; }
//配置一个Shiro的过滤器bean,这个bean将配置Shiro相关的一个规则的拦截 //例如什么样的请求可以访问什么样的请求不可以访问等等 @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){ //创建Shiro的拦截的拦截器 ,用于拦截我们的用户请求 ShiroFilterFactoryBean shiroFilter=new ShiroFilterFactoryBean(); //设置Shiro的安全管理,设置管理的同时也会指定某个Realm 用来完成我们权限分配 shiroFilter.setSecurityManager(securityManager); //用于设置一个登录的请求地址,这个地址可以是一个html或jsp的访问路径,也可以是一个控制器的路径 //作用是用于通知Shiro我们可以使用这里路径转向到登录页面,但Shiro判断到我们当前的用户没有登录时就会自动转换到这个路径 //要求用户完成成功 shiroFilter.setLoginUrl("/"); //登录成功后转向页面,由于用户的登录后期需要交给Shiro完成,因此就需要通知Shiro登录成功之后返回到那个位置 shiroFilter.setSuccessUrl("/success"); //用于指定没有权限的页面,当用户访问某个功能是如果Shiro判断这个用户没有对应的操作权限,那么Shiro就会将请求 //转向到这个位置,用于提示用户没有操作权限 shiroFilter.setUnauthorizedUrl("/noPermission"); //定义一个Map集合,这个Map集合中存放的数据全部都是规则,用于设置通知Shiro什么样的请求可以访问什么样的请求不可以访问 Map<String,String> map=new LinkedHashMap<String,String>(); // /login 表示某个请求的名字 anon 表示可以使用游客什么进行登录(这个请求不需要登录) map.put("/login","anon"); //我们可以在这里配置所有的权限规则这列数据真正是需要从数据库中读取出来 //或者在控制器中添加Shiro的注解 // /admin/** 表示一个请求名字的通配, 以admin开头的任意子孙路径下的所有请求 // authc 表示这个请求需要进行认证(登录),只有认证(登录)通过才能访问 // 注意: ** 表示任意子孙路径 // * 表示任意的一个路径 // ? 表示 任意的一个字符 map.put("/admin/**","authc"); map.put("/user/**","authc"); //表示所有的请求路径全部都需要被拦截登录,这个必须必须写在Map集合的最后面,这个选项是可选的 //如果没有指定/** 那么如果某个请求不符合上面的拦截规则Shiro将方行这个请求 // map.put("/**","authc"); shiroFilter.setFilterChainDefinitionMap(map); return shiroFilter; } }
定义com.shiro.config.MyRealm类
//自定义Realm永远完成具体的认证和授权操作 // Realm的父类抽象类 // AuthenticatingRealm 只负责认证(登录)的Realm父类 // AuthorizingRealm 负责认证(登录)和授权 的Realm父类 public class MyRealm implements Realm { @Override public String getName() { return null; } @Override public boolean supports(AuthenticationToken authenticationToken) { return false; } @Override public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { return null; } }
定义com.shiro.controller.UserController
@Controller public class UserController { @RequestMapping("/") public String index(){ return "login"; } @RequestMapping("/login") public String login(String username, String password, Model model){ return "redirect:/success"; } @RequestMapping("/success") public String success(){ return "success"; } @RequestMapping("/noPermission") public String noPermission(){ return "noPermission"; } @RequestMapping("/user/test") public @ResponseBody String userTest(){ return "这是userTest请求"; } @RequestMapping("/admin/test") public @ResponseBody String adminTest(){ return "这是adminTest请求"; } @RequestMapping("/admin/add") public @ResponseBody String adminAdd(){ Subject subject= SecurityUtils.getSubject(); return "这是adminAdd请求"; } }
以上就是简单梳理的shiro安全框架的思路。仅供参考。