使用vue集成spring security进行安全登陆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用vue集成spring security进行安全登陆相关的知识,希望对你有一定的参考价值。

参考技术A

现在前后端分离的开发模式已经成为主流,好处不多说了,说说碰到的问题和坑。首先要解决的肯定是跨域问题,这个问题之前已经有讨论,请移步 这里查看 。另外一个问题是传统的spring security安全机制是基于页面跳转的,使用302重定向(认证成功跳转至之前访问的页面,认证失败或未认证跳转至系统设置的默认登陆页面)。传统应用这么弄没问题,但现在vue一般都是基于axios进行ajax访问,ajax请求是没法直接处理302跳转的(浏览器会直接处理跳转请求,ajax的callback拿到的是跳转后的返回页面,在spring security中就是登陆首页,不符合需求)。幸好spring security所有的流程都是可以自定义的,我们可以扩展一下各个环节的流程。spring boot版本为2.1.4.RELEASE,对应的spring security版本为5.1.5.RELEASE

WebSecurityConfig 类配置如下

这里分别说明: configure 方法配置整体的认证规则,即除了 /users/login_page 和 /users/captcha 这两个方式之外全部需要认证,同时在 formLogin 方法中设置了两个自定义的handler分别处理认证成功、认证失败的情况,这里我们设置直接返回json字符串,content-type设置为 application/json;charset=utf-8 ,这样在认证完毕之后就不用自动302跳转了,而是交由axios框架来进行处理。

UnauthorizedEntryPoint 定义了异常处理的逻辑,同理我们也是直接返回ajax信息而不做跳转。

这里面我们定义了一个响应拦截器,在error情况下,判断若返回码为401(就是我们在spring security中自定义的handler的错误状态码),则自动跳转至登陆页面。这样实现了在会话失效的情况下,点击前端任意需要访问后端api的按钮,均会触发跳转登录首页的效果,符合我们的预期。实际情况中一般前端框架都会自己带一套基于cookies的认证机制,这里我们把cookies的失效时间可以设置的长一点(一般可以设为一天),以保障还是以后端会话的失效时间为准。

一般我们在处理用户登录,为安全考虑需要加入图形验证码。这里需要注意的一点是 验证码也必须作为login这个action的处理参数传入 ,否则的话这个验证码只是做了前端页面验证,实际在处理login事件的时候是没有验证码的,这样就没有意义了。而spring security框架默认只能帮助我们处理用户名+密码的这样验证方式,这样就需要对认证方式进行扩展。

这边前三个参数是从页面的login请求中传过来的,后面两个参数是在页面上请求生成图片验证码的时候我们设置到session里面去,以便于后续的验证

这个类实现了一个自定义的接口,返回我们刚才定义的 MyWebAuthenticationDetails 资源

这里自定义了一个 AuthenticationProvider 来处理实际的认证业务逻辑,在这里可以方便的根据我们需要来进行自定义,我这边分别做了验证码校验、效期校验和验密,大家可以根据需要定制。认证成功就返回一个 UsernamePasswordAuthenticationToken 对象并配置好合适的权限(权限基于标准的RBAC模型,我这里为了讲解方便设置为ROLE_ADMIN,这里不展开讲了)。如果认证失败,只需要抛出一个异常(AuthenticationException的子类),这样spring security会自动找到失败页面进行返回,对应我们上面定义的 AjaxAuthFailHandler 这个类。

配置 ADFS 3.0 / SAML 2.0 以使用 Spring Security 进行 SSO 集成

【中文标题】配置 ADFS 3.0 / SAML 2.0 以使用 Spring Security 进行 SSO 集成【英文标题】:Configuring ADFS 3.0 / SAML 2.0 to work with Spring Security for SSO integration 【发布时间】:2015-01-23 16:35:32 【问题描述】:

我遵循了第 12.0 章关于使用 spring 和 adfs 作为 IdP 的说明:http://docs.spring.io/spring-security-saml/docs/1.0.x-SNAPSHOT/reference/pdf/spring-security-saml-reference.pdf

但我在测试 SSO 时有一个例外:

org.opensaml.common.SAMLException: NameID element must be present as part of the Subject in the Response message, please enable it in the IDP configuration

我添加了文档中描述的规则 NameID。 我们在一台服务器上使用 ADFS 3.0,在另一台 Linux 服务器上使用 Tomcat,但我认为它不会对此产生影响...... 我找不到解决方法,有人(@vschafer?)有建议吗?

提前致谢!

【问题讨论】:

【参考方案1】:

终于找到了解决方案:我不得不将规则类型设置为“通过或过滤传入的声明”,因为我们的 ADFS 服务器使用其他声明提供程序。

更多信息:http://technet.microsoft.com/en-us/library/dd807060(v=ws.10).aspx

【讨论】:

感谢您的分享,如果不尝试复制它,我就不会想到这一点。我会提到手册。

以上是关于使用vue集成spring security进行安全登陆的主要内容,如果未能解决你的问题,请参考以下文章

Spring session 与 spring security saml 的集成

wso2 spring security saml 无状态集成

Spring Security:无法将我的 UserDetailService 自动连接到 AuthenticationProvider 以进行 BCrypt 集成

使用 spring-security-core 插件将 Facebook 登录 (oauth) 与现有 grails 应用程序集成

将 Spring Security 与 Facebook 登录集成

Spring Cloud Security Oauth2集成