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;
}
}
2. 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();
}
}