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 ...
随机推荐
- 论文阅读 A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SEN- TENCE EMBEDDINGS
这篇论文提出了SIF sentence embedding方法, 作者提供的代码在Github. 引入 作为一种无监督计算句子之间相似度的方法, sif sentence embedding使用预训练 ...
- 系统模块sys的常用方法
sys.argv参数 sys.argv 等价于是一个列表,argv[0] 代表当前脚本程序路径名,可以通过在外部获取多个参数传递给脚本程序执行,按照列表的取值方式第二个数据就是sys.argv[1] ...
- GIT学习与GIEE(码云体验)
GIT 是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 ...
- 自定义springboot - starter 实现日志打印,并支持动态可插拔
1. starter 命名规则: springboot项目有很多专一功能的starter组件,命名都是spring-boot-starter-xx,如spring-boot-starter-loggi ...
- 项目启动加载配置,以及IP黑名单,使用CommandLineRunner和ApplicationRunner来实现(一般用在网关进行拦截黑名单)
//使用2个类的run方法都可以在项目启动时加载配置,唯一不同的是他们的参数不一样,CommandLineRunner的run方法参数是基本类型,ApplicationRunner的run方法参数是一 ...
- 单例模式,reorder详解,线程安全,双检查锁
单例模式,分为饿汉式单例 和 懒汉式单例. 先把本类对象所需内存在main函数执行前就new出来,这是饿汉式单例. 个人思考: 为什么饿汉式不独霸天下,还有什么必要去研究使用cpp11上支持的双检查锁 ...
- Linux ALSA 音频库 配置和使用
ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...
- 达梦产品技术支持培训-day7-DM8数据库备份与还原-原理
(本文部分内容摘自DM产品技术支持培训文档,如需要更详细的文档,请查询官方操作手册,谢谢) 1.DM8备份还原简介 1.1.基本概念 (1)表空间与数据文件 ▷ DM8表空间类型: ▷ SYSTEM ...
- randomatic
下载 randomaticrandomatic 使用简单的字符序列生成指定长度的随机字符串.原generate-password. 请考虑下面这个项目的作者,Jon Schlinkert主演的,考虑项 ...
- MySQL数据备份脚本
#!/bin/bash ############################# # time:20191210 # fage trainning ######################### ...