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 ...
随机推荐
- Laver 文件版本遍历器
系统简介 最近有个需求,需要罗列出各个目录中文件的信息,检索各类文件的最新版本.网上看了很多方式,但发现没有合适的.于是利用空余时间开始编写了一套文件遍历系统,如此便有了Laver(紫菜).Laver ...
- Elasticsearch数据库 | Elasticsearch-7.5.0应用基础实战
Elasticsearch 是一个可用于分布式以及符合RESTful 风格的搜索和数据分析引擎.-- Elastic Stack 官网 关于Elasticsearch的"爱恨情仇" ...
- java学习网站汇总
1.https://blog.csdn.net/qq_35571554/article/details/82759668 B+树原理漫画讲解2.https://blog.csdn.net/moakun ...
- vue+less换肤,主题切换方案
新的项目对于客户自定义要求很高,然后换肤是其中一个很小的模块,经过了一段时间的摸索,看了许多文章,找到了几种方案. https://www.cnblogs.com/leiting/p/11203383 ...
- # 初体验之腾讯位置服务彩云天气开发者api
初体验 最近接触到了boxjs,看到了里面一个比较有意思的彩云天气的脚本,由于自己本身就是彩云天气pro的用户,日常使用过程中感觉到彩云的降雨提醒还是挺方便的,于是就准备开始使用这个天气的脚本. 脚本 ...
- 手把手教你ASP.NET Core:使用Entity Framework Core进行增删改查
新建表Todo,如图 添加模型类 在"解决方案资源管理器"中,右键单击项目. 选择"添加" > "新建文件夹". 将文件夹命名为 Mo ...
- 在sqlserver中创建表
1:在sql语句中,临时表有两类,分别是局部(local)和全局(global)临时表,局部临时表只在其会话(事务)中可见,全局临时表可以被会话(事务)中的任何程序或者 模块访问 2:创建局部临时表 ...
- Unity Shader 00 - 梳理 Unity Shader 的基本结构
0x00 写在前面 之前一直在阅读 The Book of Shaders 一书,为什么会开始写 Unity Shader 呢?一方面,因为该书目前尚未完结,写下此文时已阅读到该书的最新章节:另一方面 ...
- 给Python IDLE添加行号显示
转载:https://blog.csdn.net/howard2005/article/details/104112297 文章目录一.引出问题1.Spyder编辑Python程序能显示行号2.Pyt ...
- vue项目的elementui的form表单label的对齐方式和 el-date-picker 的长度设置
1.先按照官网的 :label-position 属性玩了一下毫无效果:发现单独使用这个属性是无效的,必须和 label-width 属性一起使用才生效: 如: <el-form :mod ...