天天看點

cas shiro 前後端分離 登入_Shiro+Cas微服務化及前後端完全分離

本文執行個體為大家分享了Shiro Cas微服務化及前後端完全分離,供大家參考,具體内容如下

shiro+cas微服務化筆記

1.Spring Boot 配置

有如下兩個配置檔案:ShiroBaseConfig.java

import lombok.extern.log4j.Log4j;

import org.apache.shiro.cache.CacheManager;

import org.apache.shiro.cache.MemoryConstrainedCacheManager;

import org.apache.shiro.cas.CasFilter;

import org.apache.shiro.codec.Base64;

import org.apache.shiro.session.mgt.eis.MemorySessionDAO;

import org.apache.shiro.web.mgt.CookieRememberMeManager;

import org.apache.shiro.web.servlet.SimpleCookie;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

@Log4j

public class ShiroBaseConfiguration {

@Value("${cas.server.url.prefix}")

private String casPrefix;

@Value("${cas.service}")

private String casService;

@Bean

public SimpleCookie sessionIdCookie() {

SimpleCookie simpleCookie = new SimpleCookie("sid");

simpleCookie.setHttpOnly(true);

simpleCookie.setMaxAge(1800000);

return simpleCookie;

}

@Bean

public SimpleCookie rememberCookie() {

SimpleCookie simpleCookie = new SimpleCookie("rememberMe");

simpleCookie.setHttpOnly(true);

simpleCookie.setMaxAge(2592000);//30天

return simpleCookie;

}

@Bean

public CookieRememberMeManager rememberMeManager(SimpleCookie rememberCookie) {

CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();

cookieRememberMeManager.setCipherKey(Base64.decode(""));// rememberMe cookie加密的密鑰 建議每個項目都不一樣 預設AES算法 密鑰長度(128 256 512 位)

cookieRememberMeManager.setCookie(rememberCookie);

return cookieRememberMeManager;

}

@Bean

public MemorySessionDAO sessionDAO() {

return new MemorySessionDAO();

}

@Bean

public CacheManager shiroCacheManager() {

return new MemoryConstrainedCacheManager();

}

@Bean

public KryCasRealm casRealm(CacheManager shiroCacheManager) {

return new KryCasRealm(casPrefix, casService, shiroCacheManager);

}

@Bean

public CasFilter casFilter() {

CasFilter casFilter = new CasFilter();

casFilter.setEnabled(true);

casFilter.setName("casFilter");

casFilter.setFailureUrl("/authority/casFailure");

return casFilter;

}

}

下面ShiroManagerConfiguration.java 檔案

import org.apache.shiro.cache.CacheManager;

import org.apache.shiro.cas.CasFilter;

import org.apache.shiro.cas.CasSubjectFactory;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.filter.authc.LogoutFilter;

import org.apache.shiro.web.mgt.CookieRememberMeManager;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.apache.shiro.web.session.mgt.ServletContainerSessionManager;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.beans.factory.config.MethodInvokingFactoryBean;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

import java.util.HashMap;

import java.util.Map;

@Configuration

@AutoConfigureAfter(

{ShiroBaseConfiguration.class}

)

public class ShiroManagerConfiguration {

@Autowired

private KryCasRealm kryCasRealm;

@Autowired

private CacheManager shiroCacheManager;

@Autowired

private CookieRememberMeManager rememberMeManager;

@Value("${cas.server.login.url}")

private String loginUrl;

@Value("${cas.client.url.prefix}")

private String urlPrefix;

@Autowired

private CasFilter casFilter;

@Value("${cas.server.logout.url}")

private String logoutUrl;

@Value("${cas.client.index.url}")

private String indexUrl;

@Bean

public DefaultWebSecurityManager securityManager() {

DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

securityManager.setRealm(kryCasRealm);

securityManager.setSessionManager(new ServletContainerSessionManager());

securityManager.setCacheManager(shiroCacheManager);

securityManager.setRememberMeManager(rememberMeManager);

securityManager.setSubjectFactory(new CasSubjectFactory());

return securityManager;

}

@Bean

public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {

MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();

bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");

bean.setArguments(new Object[]{securityManager});

return bean;

}

@Bean

public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {

ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

factoryBean.setSecurityManager(securityManager);

factoryBean.setLoginUrl(loginUrl + serviceStr + urlPrefix + "/cas");

factoryBean.setSuccessUrl("../mind/index.do");

factoryBean.setUnauthorizedUrl("/unauthorized.jsp");

Map filterMap = new HashMap<>();

filterMap.put("cas", casFilter);

filterMap.put("user", portalUserFilter);

//隻能在這裡初始化LogoutFilter,不然會被spring boot注冊到

public class PortalCasFilter extends CasFilter {

@Override

protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception {

String successUrl = ((ShiroHttpServletRequest) request).getHeader("page-url");//前端頁面在請求的時候在header中帶上請求這個接口的url。這樣便将登入成功後需要跳轉的位址綁定到了對應的Subject對象中。以便于在登入以後跳轉到這個頁面

if (StringUtil.isBlank(successUrl)) {

WebUtils.redirectToSavedRequest(request, response, getSuccessUrl());

} else {

WebUtils.redirectToSavedRequest(request, response, successUrl);

}

}

}

#4.使用者安全的退出

後期發現直接依靠原有的logout會發生session未登出的情況。是以重寫了LogoutFilter。登出的時候直接調用配置的URL即可

public class PortalLogoutFilter extends AdviceFilter {

private static final Logger log = LoggerFactory.getLogger(LogoutFilter.class);

public static final String DEFAULT_REDIRECT_URL = "/";

private String redirectUrl = DEFAULT_REDIRECT_URL;

@Override

protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {

Subject subject = getSubject(request, response);

String redirectUrl = getRedirectUrl(request, response, subject);

//try/catch added for SHIRO-298:

try {

subject.logout();

Session session = subject.getSession();

session.stop();

} catch (SessionException ise) {

log.debug("Encountered session exception during logout. This can generally safely be ignored.", ise);

}

issueRedirect(request, response, redirectUrl);

return false;

}

}

以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援我們。

時間: 2019-12-16