springboot整合shior初体验
什么是shiro?
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
他有三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。 Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
快速开始
引入maven坐标
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring --> <!--shiro整合spring的包--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.5.3</version> </dependency> 复制代码
- 编写config文件
package com.config; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; //shiro的配置类 @Configuration public class ShiroConfig { //第三步:ShiroFilterFactoryBean(看源码需要传入哪些值) @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager defaultSecurityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean =new ShiroFilterFactoryBean(); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager); //添加shiro的内置过滤器 /* anno: 无需认证就可以访问 authc:必须认证了才可以访问 user: 必须拥有记住我功能才可以用 perms:拥有对某个资源的权限才可以访问 role:拥有某个角色权限才可以访问 * */ Map<String,String> filterMap =new HashMap<String, String>(); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); filterMap.put("/user/add","authc");//只有认证了才可以访问/user/add页面 filterMap.put("/user/update","authc"); return shiroFilterFactoryBean; } //第二步获取DafaultWebSecurityManager @Bean(name = "securityManager")//不用默认的方法名充当名字,自己设置一个 public DefaultSecurityManager getWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//绑定userRealm DefaultWebSecurityManager webSecurityManager =new DefaultWebSecurityManager(); //关联userRealm webSecurityManager.setRealm(userRealm); return webSecurityManager; } //第一步,创建realm对象,需要自定义 @Bean public UserRealm userRealm(){ return new UserRealm(); }//自定义的UserRealm类被spring托管 } 复制代码
- 创建测试html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <hr> <a th:href="@{/user/add}">add</a> <a th:href="@{/user/update}">update</a> </body> </html> 复制代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> add </body> </html> 复制代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> update </body> </html> 复制代码
开始测试
登陆界面:
点击图中的add按钮:
点击图中的update按钮:
均为没有权限,无法访问网站
改进思路
如果没有权限,应该跳转到登陆页面,而不是直接报404错误,所以需要添加登录页和修改部分代码
添加登录页
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登陆</h1> <hr> <form action="/login"> <p>账号:<input type="text" name="usermame"></p> <p>密码:<input type="text" name="password"></p> <input type="submit" value="登陆"> </form> </body> </html> 复制代码
修改Controller
添加了登陆的方法
package com.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ShiroController { @RequestMapping({"/","/index"}) public String toindex(){ return "index"; } @RequestMapping({"/user/add"}) public String add(){ return "user/add"; } @RequestMapping({"/user/update"}) public String update(){ return "user/update"; } @RequestMapping({"/login"}) public String login(){ return "user/login"; } } 复制代码
修改config文件
添加setLoginUrl方法
package com.config; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; //shiro的配置类 @Configuration public class ShiroConfig { //第三步:ShiroFilterFactoryBean(看源码需要传入哪些值) @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager defaultSecurityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean =new ShiroFilterFactoryBean(); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager); //添加shiro的内置过滤器 /* anno: 无需认证就可以访问 authc:必须认证了才可以访问 user: 必须拥有记住我功能才可以用 perms:拥有对某个资源的权限才可以访问 role:拥有某个角色权限才可以访问 * */ Map<String,String> filterMap =new HashMap<String, String>(); filterMap.put("/user/add","authc");//只有认证了才可以访问/user/add页面 filterMap.put("/user/update","authc"); //filterMap.put("/user/*","authc"); 支持通配符写法 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); shiroFilterFactoryBean.setLoginUrl("/login");//设置登陆请求 return shiroFilterFactoryBean; } //第二步获取DafaultWebSecurityManager @Bean(name = "securityManager")//不用默认的方法名充当名字,自己设置一个 public DefaultSecurityManager getWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//绑定userRealm DefaultWebSecurityManager webSecurityManager =new DefaultWebSecurityManager(); //关联userRealm webSecurityManager.setRealm(userRealm); return webSecurityManager; } //第一步,创建realm对象,需要自定义 @Bean public UserRealm userRealm(){ return new UserRealm(); }//自定义的UserRealm类被spring托管 } 复制代码
再次测试
点击add(update)
okk!!第一次使用springboot整合shiro结束了,接下来我会继续学习!