springboot整合shiro排雷
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结束了,接下来我会继续学习!
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=onli16hq7fag
**
- 点赞
- 收藏
- 关注作者
评论(0)