Spring Shiro配置第三方SSO客户端登录
经过实践的Shiro配置,利用 sSOInterceptor 进行sso登录拦截
配置
@Configuration
public class ShiroConfiguration extends BaseLogger {
@Autowired(required = false)
private SSOInterceptor sSOInterceptor;
@Autowired(required = false)
private CacheUtils cacheUtils;
//将自己的验证方式加入容器
@Bean
public UserShiroRealm myShiroRealm() {
//自定义realm,授权+登录
UserShiroRealm myShiroRealm = new UserShiroRealm();
//自定义login token类型
myShiroRealm.setAuthenticationTokenClass(XXAuthenticationToken.class);
return myShiroRealm;
}
//权限管理,配置主要是Realm的管理认证
@Bean
public DefaultWebSecurityManager securityManager(UserShiroRealm userShiroRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userShiroRealm);
//web session管理
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//企业级缓存sessionDao,获取和保存session,这里session将保存到cacheManager中
sessionManager.setSessionDAO(new EnterpriseCacheSessionDAO());
//安全管理器设置session控制器
securityManager.setSessionManager(sessionManager);
//设置cacheManager,鉴权和session使用同一个cache,因为session为uuid,用户为用户名,不会冲突
securityManager.setCacheManager(new CacheManager() {
@Override
public <K, V> Cache<K, V> getCache(String name) throws CacheException {
logger.info("get cache:{}", name);
return new JimdbCache<>(cacheUtils, CacheConstants.shiroCacheKey(""));
}
});
return securityManager;
}
//Filter工厂,设置对应的过滤条件和跳转条件
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(org.apache.shiro.web.mgt.DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
//url拦截权限定义
Map<String, String> map = new HashMap<>();
//登出自己控制
//map.put("/logout","logout");自己控制登出
//对所有用户认证
map.put("/**", "authc");
//静态资源部校验
map.put("/static/**", "anon");
map.put("/checkAppOn.html", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
//登录地址,首页地址触发sso登录
shiroFilterFactoryBean.setLoginUrl("/");
//首页
shiroFilterFactoryBean.setSuccessUrl("/index");
//错误页面,认证不通过时跳转
shiroFilterFactoryBean.setUnauthorizedUrl("/error");
//自定义登录过滤器,校验登录,不能直接将filter放入Spring中,他会和ShiroFilter同级,造成混乱
shiroFilterFactoryBean.getFilters().put("authc", new XXAuthenticationFilter(sSOInterceptor));
return shiroFilterFactoryBean;
}
//加入注解的使用,不加入这个注解不生效
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(org.apache.shiro.web.mgt.DefaultWebSecurityManager securityManager) {
//注解支持,可支持类级、method级权限控制
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
}
登录校验Filter
public class XXAuthenticationFilter extends AdviceFilter {
private final static Logger LOGGER = LoggerFactory.getLogger(ErpAuthenticationFilter.class);
private SSOInterceptor sSOInterceptor;
public ErpAuthenticationFilter(SSOInterceptor sSOInterceptor) {
this.sSOInterceptor = sSOInterceptor;
}
/**
* 处理sso登录信息,且可登录,返回true
*
* @param srequest
* @param sresponse
* @return
* @throws Exception
*/
protected boolean preHandle(ServletRequest srequest, ServletResponse sresponse) throws Exception {
HttpServletRequest request = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
try {
//sSOInterceptor来控制跳转登录sso页
if (sSOInterceptor.preHandle(request, response, null)) {
LoginContext loginContext = ActionContext.getLoginContext();
Subject subject = SecurityUtils.getSubject();
//没有登录时,自动登录系统
if(!subject.isAuthenticated()) {
subject.login(new ErpAuthenticationToken(loginContext.getAccount(), loginContext));
}
return true;
}
} catch (Exception e) {
LOGGER.error("预处理登录信息失败", e);
}
//中止处理链条
return false;
}
}
登出
@RequestMapping(value = {"/logout", "/login"})
public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
LoginContext loginContext = ActionContext.getLoginContext();
//删除业务key
cookieUtils.deleteCookie(response, Profiles.getCookieKey());
logger.info("用户:{} 退出", loginContext.getAccount());
//清缓存
cacheUtils.deleteObject(CacheConstants.manUserShiroCacheKey(loginContext.getAccount()));
cacheUtils.deleteObject(CacheConstants.manUserMenuCacheKey(loginContext.getAccount()));
//shiro登出
Subject subject = SecurityUtils.getSubject();
subject.logout();
//清除cookie
removeCookie(response);
ErpDotnetInterceptor.toErpLogin(request, response);
}
private void removeCookie(HttpServletResponse response) {
Cookie cookie = new Cookie(Profiles.getCookieKey(),"");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
Spring Shiro配置第三方SSO客户端登录的更多相关文章
- spring + shiro + cas 实现sso单点登录
sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次,项目源码 系统模块说明 cas: 单点登录模块,这里直接拿的是cas的项目改了点样 ...
- (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- Spring+shiro配置JSP权限标签+角色标签+缓存
Spring+shiro,让shiro管理所有权限,特别是实现jsp页面中的权限点标签,每次打开页面需要读取数据库看权限,这样的方式对数据库压力太大,使用缓存就能极大减少数据库访问量. 下面记录下sh ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...
- 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角色 client:调用资源服务器API的应用 O ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)
上一篇我根据框架中OAuth2.0的使用总结,画了一个根据用户名+密码实现OAuth2.0的登录认证的流程图,今天我们看一下logout的流程: /** * 用户注销 * @param accessT ...
- Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定
一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼.本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring ...
随机推荐
- Git裸仓库的分支(Active Branch)切换
Git裸仓库的Active Branch切换方法 在服务器上通过init --bare创建了一个裸仓库作为远程仓库使用,并且存在三个分支(master/kid/develop),但在使用中发现代码虽然 ...
- 二分类问题续 - 【老鱼学tensorflow2】
前面我们针对电影评论编写了二分类问题的解决方案. 这里对前面的这个方案进行一些改进. 分批训练 model.fit(x_train, y_train, epochs=20, batch_size=51 ...
- vulnhub-Os-hackNos-3
vulnhub-Os-hackNos-3 nmap 192.168.114.0/24 查看存活主机,发现192.168.114.142. 具体探究: 发现80和22端口是开放的. dirb没扫出来啥, ...
- Metasploit之后渗透攻击(信息收集、权限提升)
利用永恒之蓝漏洞入侵Windows7 流程参考https://www.jianshu.com/p/03a1c13f963a,实在是太棒啦!!! 目标主机为win7(IP:192.168.1.102): ...
- Spring学习(十一)--Spring MVC
1.MVC模式 (1)视图 通过视图展示应用数据 向应用数据提供更新动作 向控制器提交用户动作 运行控制器选择不同视图 (2)模型提供 封装应用数据状态 响应数据状态查询 提供应用功 ...
- 神奇的字符串匹配:扩展KMP算法
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...
- 星涛:采用java递归复制文件夹
package com.botao; import java.io.*; /** * @author cbt28 */ public class FileUtil { public static St ...
- Java知识系统回顾整理01基础01第一个程序01JDK 安装
一.首先第一步看JDK配置成功后的效果 点WIN键->运行(或者使用win+r) 输入cmd命令 输入java -version 注: -version是小写,不能使用大写,java后面有一个空 ...
- C++指针delete后还要置为null
非常好的一篇说明: 转载:https://blog.csdn.net/qq_36570733/article/details/80043321 众所周知,最开始我们用new来创建一个指针,那么等我们用 ...
- java安全编码指南之:lock和同步的正确使用
目录 简介 使用private final object来作为lock对象 不要synchronize可被重用的对象 不要sync Object.getClass() 不要sync高级并发对象 不要使 ...