shiro实现用户登录认证需要三个核心api
Subject 用户主体
SecurityManager 安全管理器
Realm 连接数据的桥梁
1. 导入shiro的maven依赖
导入shiro和spring整合的依赖
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>
2. 编写Realm类
我们在项目中新建一个 shiro目录并在里边新建一个UserRealm.java类
该类要继承 AuthorizationRealm
继承后要实现里面的两个方法如下, 分别实现授权和认证
package com.krlin.springbootshiro.shiro; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; public class UserRealm extends AuthorizingRealm { /** * 执行授权逻辑 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权逻辑"); return null; } /** * 执行认证逻辑 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("执行认证逻辑"); return null; } }
3. ShiroConfig配置类
我们在shiro目录下再新建一个ShiroConfig.java 配置类
在shiro的配置类中我们需要写三个东西,分别如下:
package com.krlin.springbootshiro.shiro; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { /** * 创建 ShiroFilterFactoryBean */ /** * 创建 DefaultWebSecurityManager */ /** * 创建 Realm */ }
我们先来创建Realm
/** * 创建 Realm * @Bean 的作用: 将该方法返回的对象放入spring容器, 以便给上边的方法使用 */ @Bean public UserRealm userRealm() { return new UserRealm(); }
然后创建 DefaultWebSecurityManager
/** * 创建 DefaultWebSecurityManager * @Qualifier 注解 表示传入的参数是下边那个放入spring容器中的bean */ public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 这里要吧 userRealm 和 securityManager 关联 securityManager.setRealm(userRealm); return securityManager; }
最后创建 ShiroFailterFactoryBean
/** * 创建 ShiroFilterFactoryBean */ public ShiroFilterFactoryBean getShiroFilterFactoryBean (@Qualifier("securityManager") DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); // 设置安全管理器 filterFactoryBean.setSecurityManager(securityManager); return filterFactoryBean; }
至此shiro配置类编写完成, 完整代码如下:
package com.krlin.springbootshiro.shiro; 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; @Configuration public class ShiroConfig { /** * 创建 ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean (@Qualifier("securityManager") DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); // 设置安全管理器 filterFactoryBean.setSecurityManager(securityManager); return filterFactoryBean; } /** * 创建 DefaultWebSecurityManager * @Qualifier 注解 * @Bean 注解里的 name 指定放到spring容器中的名字, 若不写, 默认为方法名 */ @Bean(name = "securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 这里要吧 userRealm 和 securityManager 关联 securityManager.setRealm(userRealm); return securityManager; } /** * 创建 Realm * @Bean 的作用: 将该方法返回的对象放入spring容器, 以便给上边的方法使用 */ @Bean public UserRealm userRealm() { return new UserRealm(); } }