文章目录
0.版本
springBoot
:2.4.4
shiro
:1.5.3
1. 关键
Shiro
提供一个ShiroFilter
完成对所有的请求的拦截,进行认证。- 认证完毕,对于受限资源需要认证,公共资源则直接放行。
2. 整合
2.1 创建SpringBoot项目
略
2.2 引入shiro依赖
pom.xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.5.3</version>
</dependency>
2.3 配置Shiro
com.xxx.xxx.config.ShiroConfig
CustomerRealm
查看 2.4
@Configuration
public class ShiroConfig {
// 1. 创建ShiroFilter,使用一个ShiroFilterFactorBean 进行生产即可
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 给 filter 设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 配置系统的受限资源,与公共资源
Map<String, String> map = new HashMap<>();
// authc : 请求i这个资源需要认证 和 授权, 从 servlet-contextPath 以后开
// /** 所有的资源
// 当发现页面需要认证的时候,会自动跳转到默认认证页面,默认为/login.jsp
map.put("/index.jsp", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
// 手动设置默认认证页面路径
shiroFilterFactoryBean.setLoginUrl("/login.jsp");
return shiroFilterFactoryBean;
}
// 2. 创建安全管理器
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("customerRealm") Realm realm) {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(realm);
return defaultWebSecurityManager;
}
// 3. 创建自定义Realm
@Bean("customerRealm")
public Realm getRealm() {
return new CustomerRealm();
}
}
2.3.1 常见过滤器
shiro
提供了多个默认的过滤器,我们可以用这些过滤器来配置 url
的权限。
2.4 登录认证
2.4.1 流程解析
- 根据
2.3
配置完毕ShiroFilter
等内容,并在其中设置index.jsp
为受限资源,其他为非受限资源。 - 用户未登录过,直接访问
index.jsp
,ShiroFilter
拦截到了以后,直接跳转到设置好的登录页面login.jsp
; - 用户在
login.jsp
页面当中填写完毕登录信息,提交到地址user/login
,由UserController
进行处理。 - 如果使用
subject
登录成功,则重定向到index.jsp
页面(此时响应头已经写入JSESSIONID)。此后进入认证受限的页面不会再跳转到login.jsp
了。 - 登录失败,则重定向到
login.jsp
继续登录.
2.4.1 index.jsp / login.jsp
src/webapp/index.jsp
<%@page contentType="text/html; UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>主页</h1>
</body>
</html>
src/webapp/login.jsp
<%@page contentType="text/html; UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="${pageContext.request.contextPath}/user/login" method="post">
用户名: <input type="text" name="username"><br/>
密码: <input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
2.4.2 编写 Realm 模拟认证
com.xxx.xxx.shiro.realms.CustomerRealm
public class CustomerRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String principal = (String) authenticationToken.getPrincipal();
if("zch".equals(principal)