shiro整合springboot前后端分離
本文實例為大家分享了shiro整合springboot前后端分離的具體代碼,供大家參考,具體內容如下
1、shiro整合springboot的配置
package com.hisi.config;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.Filter;
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import com.hisi.shiro.LoginAuthorizationFilter;
import com.hisi.shiro.RestFilter;
import com.hisi.shiro.UserRealm;
/**
* shiro權限管理的配置
* @author xuguoqin
* @date 2018年5月4日
* @version 1.0
*/
@Configuration
public class ShiroConfig {
/**
* 安全管理器
* @param realm
* @return
*/
@Bean
public DefaultWebSecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userRealm());
securityManager.setSessionManager(sessionManager());
return securityManager;
}
/**
* Realm配置
* @return
*/
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
/**
* SessionDAO配置
* @return
*/
@Bean
public SessionDAO sessionDAO(){
return new MemorySessionDAO();
}
/**
* sessionManager配置
* @param sessionDAO
* @return
*/
@Bean
public DefaultWebSessionManager sessionManager(){
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionDAO(sessionDAO());
return sessionManager;
}
/**
* shiroFilter配置
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager());
Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
filters.put("token", new LoginAuthorizationFilter());
filters.put("corsFilter", new RestFilter());
shiroFilter.setFilters(filters);
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
filterChainDefinitionMap.put("/user/login", "corsFilter,anon");
filterChainDefinitionMap.put("/user/logout", "corsFilter,anon");
filterChainDefinitionMap.put("/user/**", "corsFilter,token");
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilter;
}
/**
* 保證實現了Shiro內部lifecycle函數的bean執(zhí)行
*/
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
/**
* 啟用shrio授權注解攔截方式,AOP式方法級權限檢查
*/
@Bean
@DependsOn(value = "lifecycleBeanPostProcessor") //依賴其他bean的初始化
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
return new DefaultAdvisorAutoProxyCreator();
}
/**
* 加入注解的使用,不加入這個注解不生效 使用shiro框架提供的切面類,用于創(chuàng)建代理對象
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
}
2、這里配置的兩個過濾器RestFilter和LoginAuthorizationFilter,RestFilter是用于解決前后端分離時的跨域問題,服務端在響應頭設置可以接受的請求參數
package com.hisi.shiro;
import java.io.IOException;
import java.util.Optional;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 前后端分離RESTful接口過濾器
*
* @author xuguoqin
*
*/
public class RestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = null;
if (request instanceof HttpServletRequest) {
req = (HttpServletRequest) request;
}
HttpServletResponse res = null;
if (response instanceof HttpServletResponse) {
res = (HttpServletResponse) response;
}
if (req != null && res != null) {
//設置允許傳遞的參數
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
//設置允許帶上cookie
res.setHeader("Access-Control-Allow-Credentials", "true");
String origin = Optional.ofNullable(req.getHeader("Origin")).orElse(req.getHeader("Referer"));
//設置允許的請求來源
res.setHeader("Access-Control-Allow-Origin", origin);
//設置允許的請求方法
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
前者ajax請求的時候應該帶上參數
$.ajax({
type: "GET",
url: url,
xhrFields: {
withCredentials: true // 攜帶跨域cookie
},
processData: false,
success: function(data) {
console.log(data);
}
});
3、LoginAuthorizationFilter主要是對未登錄的用戶進行過濾然后返回json數據給前端,之前遇到的問題就是shiro配置的loginUrl會導致出現302的問題,在前后端分離的項目中,頁面的跳轉應該由前端來進行控制,這里前端使用的是vue框架,我需要對shiro中未登錄的過濾器FormAuthenticationFilter進行重構
package com.hisi.shiro;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.fastjson.JSONObject;
import com.commons.model.YfpjResult;
import com.hisi.mapper.HisiUserMapper;
import com.hisi.model.HisiUser;
import com.hisi.util.Constant;
import com.hisi.util.UserAuthStatusEnum;
/**
* shiro未登錄反回狀態(tài)碼
* @author xuguoqin
* @date 2018年5月10日
* @version 1.0
*/
public class LoginAuthorizationFilter extends FormAuthenticationFilter {
/**
* 這個方法是未登錄需要執(zhí)行的方法
*/
@Override
protected boolean onAccessDenied(ServletRequest request,
ServletResponse response) throws IOException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
Subject subject = getSubject(request, response);
if (subject.getPrincipal() == null) {
//設置響應頭
httpResponse.setCharacterEncoding("UTF-8");
httpResponse.setContentType("application/json");
//設置返回的數據
YfpjResult result = YfpjResult.build(UserAuthStatusEnum.UNLOGIN.getCode(), UserAuthStatusEnum.UNLOGIN.getMsg());
//寫回給客戶端
PrintWriter out = httpResponse.getWriter();
out.write(JSONObject.toJSONString(result));
//刷新和關閉輸出流
out.flush();
out.close();
} else {
//設置響應頭
httpResponse.setCharacterEncoding("UTF-8");
httpResponse.setContentType("application/json");
//設置返回的數據
YfpjResult result = YfpjResult.build(UserAuthStatusEnum.UNAUTH.getCode(), UserAuthStatusEnum.UNAUTH.getMsg());
//寫回給客戶端
PrintWriter out = httpResponse.getWriter();
out.write(JSONObject.toJSONString(result));
//刷新和關閉輸出流
out.flush();
out.close();
}
return false;
}
}
4.以后在進行前后端分離的項目開發(fā)的時候,可以前端封裝一個允許帶cookie的ajax請求,同時封裝一個統(tǒng)一的未登錄或者未授權狀態(tài)碼的判斷
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題
- SpringBoot集成Shiro進行權限控制和管理的示例
- SpringBoot 整合 Shiro 密碼登錄與郵件驗證碼登錄功能(多 Realm 認證)
- SpringBoot 整合 Shiro 密碼登錄的實現代碼
- 解決Springboot整合shiro時靜態(tài)資源被攔截的問題
- springboot整合Shiro的步驟
- Springboot實現Shiro整合JWT的示例代碼
- Springboot 整合shiro實現權限控制的方法
- SpringBoot中整合Shiro實現權限管理的示例代碼
- springboot2.x整合shiro權限框架的使用
- 基于springboot實現整合shiro實現登錄認證以及授權過程解析
- Springboot整合Shiro的代碼實例
- SpringBoot2.0整合Shiro框架實現用戶權限管理的示例
- Springboot整合Shiro之加鹽MD5加密的方法
- springboot集成shiro詳細總結
相關文章
Java通過反射機制將對象封裝成JSON和JsonArray格式
這篇文章主要介紹了Java通過反射機制將對象封裝成JSON和JsonArray格式,JAVA反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法,需要的朋友可以參考下2023-10-10
Spring?Boot2.6.0新特性之默認禁止循環(huán)引用
Spring?Boot2.6.0為我們帶來很多好用的新特性/改進,這篇文章主要給大家介紹了關于Spring?Boot2.6.0新特性之默認禁止循環(huán)引用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-02-02
Java兩個List<T> 求交集,差集,并集,去重后的并集
本文主要介紹了Java兩個List<T> 求交集,差集,并集,去重后的并集,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
Spring MVC集成springfox-swagger2構建restful API的方法詳解
這篇文章主要給大家介紹了關于Spring MVC集成springfox-swagger2構建restful API的相關資料,文中介紹介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06

