如何让spring security不拦截第三方的对接方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让spring security不拦截第三方的对接方法相关的知识,希望对你有一定的参考价值。
参考技术A 是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中,已经实现过,并经过验证;二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证。
三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,
并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。
目前这种方式已经实现,并经过验证。
四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。
前者是将配置文件或数据库中本回答被提问者采纳
使用 Spring Security 进行会话管理
【中文标题】使用 Spring Security 进行会话管理【英文标题】:Session management using spring security 【发布时间】:2016-04-26 02:44:19 【问题描述】:我已经使用 UserDetailsService 创建了一个基本的 spring 安全认证,现在我可以验证用户了。但是,我不明白如何实现以下目标:
-
一旦用户登录,当下一个请求到来时,我如何以及在哪里检查请求是来自同一个登录用户还是其他登录用户?
我知道 Spring 拦截器的概念,我可以在其中拦截所有传入的请求。但是 spring security 中是否有这样做的东西?
-
如何在登录后启动会话并将值存储在该用户的会话中?
我浏览了现有的答案,但大多数示例都是用于登录的。
如果有人能给我例子,我将不胜感激。
编辑: 我认为我应该使用会话范围的 bean 来维护用户的会话内容,而不是直接操作 httpsession。
【问题讨论】:
您阅读过文档吗? 文档真的很混乱而且很多。 春季安全参考指南对如何配置会话管理非常清楚...... 它在 Spring 安全文档中。请参阅此处docs.spring.io/spring-security/site/docs/current/reference/…。而且它的文档记录非常清楚且简单明了。 我检查了这部分docs.spring.io/spring-security/site/docs/current/reference/…,但我没有得到可以用来获取会话的样本。如果您能指出某些部分,那将很有帮助。 【参考方案1】:首先您需要使用当前的 HttpRequest 创建一个 Authentication 对象,如下所示:
public class SessionService
public Authentication getSession(HttpServletRequest request)
HttpSession session=request.getSession();
SecurityContext ctx= (SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT");
Authentication auth=ctx.getAuthentication();
return auth;
然后,您可以通过传递当前 HttpRequest 来从此 Authentication 对象中检索会话详细信息,如下所示:
Authentication auth = sessionService.getSession(request);
上述身份验证对象包含您需要的详细信息。
【讨论】:
【参考方案2】:我认为您确实需要花一些时间阅读 Spring 安全文档以及所有 JSP、servlet 和 MVC 架构。你有几个误区,
身份验证后,您无需启动请求到来时已经存在的会话。请记住request.getSession()
我们从请求中获取会话,我真的不知道任何其他方式,即实例化会话对象并将其分配给请求/响应。认证成功后,spring 会自动在 session 中设置一个 SPRING_SECURITY_CONTEXT 属性,这个变量稍后用于确定用户是否已经通过身份验证(Spring 会为您执行此操作,您不需要使用此属性)。
在 Spring Security 中,我们设置了一个身份验证入口点,其中包含有关登录页面 url 的信息和 FORM_LOGIN_FILTER,其中包含有关登录处理 url、登录成功 url 和登录失败 url 等信息。每个会话的请求都没有没有 SPRING_SECURITY_CONTEXT 并且 auth 属性被重定向到登录页面 url。
我可以直接提供代码,但如果您至少阅读几页 Spring 文档 here,那就太好了。一旦你理解了这些概念,仍然无法解决问题。用详细的问题编辑您的问题,我们将尝试解决它。
【讨论】:
感谢您的信息。我知道从请求中获取会话 request.getSession(true) 但我认为 Spring Security 可能有一些“其他”方式来做到这一点。例如:它可能会为我创建一个会话,而我必须使用它. 是的,Spring 会为您创建一个会话,您可以直接使用它。找到另一个有用的链接,请参阅此studytrails.com/frameworks/spring/… link 这篇文章说“出于安全目的,您不应该直接与 HttpSession 交互。这样做没有任何理由 - 始终使用 SecurityContextHolder。”但是 SecurityContextHolder 的代码没有给我会话。以上是关于如何让spring security不拦截第三方的对接方法的主要内容,如果未能解决你的问题,请参考以下文章
Spring security 如何设置才能避免拦截到静态资源
Spring Security 拦截 URL 究竟是如何工作的?