之前了解了如何快速引如spring security进行项目的权限控制,但是在实际过程中业务要复杂很多。此来了解spring security实战开发实例。
1.自定义过滤
2.成功与异常之后自定义处理
3.自定义登录-短信登录
3.1创建短信登录token
3.2 创建短信登录Filter
3.3创建短信Provider
3.4配置短信Filter
4.登录前验证
5.session共享
5.注销登录
并不是所有的请求都需要权限验证,需要有的请求取消权限验证。
如此可以完成某些请求不需要验证。
注:hasRole这个是在<code>UserDetailsService</code>的实现中进行授权的。但是权限信息默认会有<code>ROLE_</code>作为开头。
一般前后端分离的时候,后端是没有页面的,如果有各种异常操作,只需要返回状态码即可
SimpleUrlAuthenticationFailureHandler请求失败处理类,在<code>spring security</code>认证失败后会进入此类,在此类中可以自定义认证失败逻辑。前后端分离时可进行自定义异常返回。
SavedRequestAwareAuthenticationSuccessHandler请求成功处理类。<code>spring security</code>在请求成功时,会进入这里,可以自定义返回用户信息。
写好成功和失败的逻辑之后进行配置。
成功登陆之后返回:
{“authorities”:[{“authority”:“ROLE_admin”}],“details”:{“remoteAddress”:“0:0:0:0:0:0:0:1”,“sessionId”:“9D02A1032740267FC1392647ADF31166”},“authenticated”:true,“principal”:{“password”:null,“username”:“admin”,“authorities”:[{“authority”:“ROLE_admin”}],“accountNonExpired”:true,“accountNonLocked”:true,“credentialsNonExpired”:true,“enabled”:true},“credentials”:null,“name”:“admin”}
成功和失败时候有自定义处理器还有自定义跳转<code>successForwardUrl</code>和<code>failureForwardUrl</code>可根据场景进行选择
默认的表单登录是无法满足我们的需求,比如登录地址修改,登录成功之后返回json。
短信登录
token是用来存储用户信息的。
这个就类似<code>UsernamePasswordAuthenticationFilter</code>主要是拦截请求到此。
设置路径为<code>/auth/mobile</code>的<code>get</code>请求到此filter。
短信登录逻辑写好之后,将短信登录的逻辑进行配置。使它生效。
修改<code>ExampleSecurityConfig</code>
<code>spring security</code>是很多的Filter组成的,我们可以在Filter链上进行添加自己的Filter。比如在输入账号密码前输入手机验证码或者图片验证码。
创建验证Filter
配置此Filter在短信验证Filter之前。
其实短信验证码验证逻辑写在短信登录Filter中也可以。但是随着业务逻辑的逐渐复杂,如果普通账号密码登录也需要验证码时,就需要单独提取出来一个Filter进行验证,防止代码冗余。
单机情况下session几乎不需要处理,若多个服务的时候,就要实现session共享。
redis实现session共享
添加redis依赖
添加redis配置信息
直接复制走即可
配置好之后,启动redis,通过登录,登录完成之后redis如果有<code>spring:session</code>开头的key,证明session共享成功。

登录成功之后需要保存session,注销登录需要把session进行清理
注销地址修改
默认注销登录的地址是<code>/logout</code>,修改注销地址。
注销成功之后可以自定义处理<code>logoutSuccessUrl</code>或者<code>logoutSuccessHandler</code>,从名字上可以看出来,一个是跳转地址,一个是实现处理器。
注销成功处理器。
<code>/mylogout</code>地址默认的可能是POST请求,如果浏览器直接访问可能访问不成功。如此配置即可