首先,现阶段网上的spring security配置资料中都涉及登录页面的的登录。几乎找不到根据用户名密码直接登录的方式。现将该方式记录下来。

我碰到的问题:这是一个很常见的业务需求,用户访问系统发送请求时带了用户信息参数,不需要将页面跳转到登录页面进行登录,直接通过请求时的用户信息进行登录Spring Security验证用户信息就OK的。

为了完成这样的一个需求,过程是还是有点曲折的(原来那个我是一个小白),网上所能给出的什么登录配置是如下配置过程:

1、spring-security.xml这个配置文件进行配置form-login这个配置选项。

spring 通过账号密码登录redis spring登陆_Spring

2、web.xml配置文件进行配置spring-security过滤器。

spring 通过账号密码登录redis spring登陆_代码实现SpringSecurity登录_02

3、实现UserDetailsService接口,进行验证登录。

spring 通过账号密码登录redis spring登陆_SpringSecurity_03

4、定义登录页面跳转方法”/loginpage”。

spring 通过账号密码登录redis spring登陆_代码实现SpringSecurity登录_04

这样的登录能在登录页面实现用户登录,但和需求直接登录存在差异,需要经过一个一个登录页面跳转登录。所以,我开始尝试修改程序:

获取用户信息直接将用户名密码转发到登录方法去。

spring 通过账号密码登录redis spring登陆_用户信息_05

结果很惨,错误大大的,后台报Access is Denied错误。查询原因是/login在springsecurity配置中是必须以登录页面(这里是/loginpage页面)中表单提交方式访问的。直接使用forward方式访问时行不通了。

尝试很多方式,于是我只能求助万能的博客,翻了大半个互联网中找到了一篇博客解决该问题的方案。在参考Spring Security官方文档,在官方文档中找到AuthenticationManager接口、SecurityContextHolder类及SecurityContext接口等完成我自动登录的操作。下面介绍一下上述接口及类:
AuthenticationManager接口,接触了SpringSecurity的童鞋们应该了解这个接口是干什么的。AuthenticationManager这个接口是SpringSecurity认证接口。SpringSecurity认证是通过AuthenticationManager的authenticate函数实现的。也就是通过AuthenticationManager实现类ProviderManager等等实现类中的authenticate函数完成SpringSecurity的认证。

SecurityContextHolder类,SecurityContextHolder的主要功能是将当前正在执行的thread与SecurityContext关联起来,简单来说是将当前请求处理与SecurityContext关联起来。其中getContext() 通过这个方法获得当前的SecurityContext。

SecurityContext接口,SecurityContext接口表示的是当前应用的安全上下文。通过此接口可以获取和设置当前的认证对象。

说到这里,其实大家应该知道我要做什么事了。仿照SpringSecurity的验证机制去进行自动验证完成整一个验证过程:

  1. 组装认证用户信息Token。
  2. 使用用户信息Token完成SpringSecurity认证获得认证对象。
  3. 设置第二步骤中的认证对象设置为当前的SpringSecurity的认证对象。
  4. 跳转认证后想跳转的页面。

最后尝试完成认证过程代码:

spring 通过账号密码登录redis spring登陆_用户信息_06

至此,测试通过了!!!