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