爱测未来开发-SpringSecurity实战

一、SpringSecurity简介


Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion ofControl ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。


Spring Security对Web安全性的支持大量地依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。


Spring Security的安全操作包括了两个部分:

第一个被称为“认证”,是为用户建立一个他所声明的主体。主体一般是指用户,设备或可以在系统中执行动作的其他系统。

第二个叫“授权”,指的是一个用户能否在应用中执行某个操作,在到达授权判断之前,身份的主体已经由身份验证过程建立。


二、SpringSecurity简单原理


先大概过一遍整个流程,用户登陆,会被AuthenticationProcessingFilter拦截,调用AuthenticationManager的实现,而且AuthenticationManager会调用ProviderManager来获取用户验证信息(不同的Provider调用的服务不同,因为这些信息可以是在数据库上,可以是在LDAP服务器上,可以是xml配置文件上等),如果验证通过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中,以备后面访问资源时使用。


访问资源(即授权管理),访问url时,会通过AbstractSecurityInterceptor拦截器拦截,其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的全部权限,在调用授权管理器AccessDecisionManager,这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的全部权限,然后根据所配的策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则返回,权限不够则报错并调用权限不足页面。


三、SpringSecurity配置


首先在web.xml中配置Spring Security的过滤器,过滤用户的请求,配置如下:



爱测未来开发-SpringSecurity实战


在Spring Security的配置config中,需要配置不拦截的静态资源与请求、登录成功与失败的跳转地址、登录超时、无权限访问以及认证逻辑部分。具体为:

首先是配置不拦截的静态资源与请求,配置具体为:

爱测未来开发-SpringSecurity实战

然后配置登录成功与失败的跳转地址,具体配置为:

爱测未来开发-SpringSecurity实战

然后配置登录超时、无权限访问部分,具体配置为:

爱测未来开发-SpringSecurity实战

最后配置认证逻辑部分,在本人参与的两个项目中,认证逻辑部分采用自定义的认证逻辑,具体配置为:

爱测未来开发-SpringSecurity实战

自定义认证逻辑需在spring-security.xml中配置,配置为:

爱测未来开发-SpringSecurity实战

自定义认证逻辑为:

爱测未来开发-SpringSecurity实战


四、登录超时与无权限访问处理


spring-security提供了对登录超时以及无权限访问的处理方法,依据实际的需要,我们需要对这两个方法重写,在实际的项目中,需要抓到登录超时以及无权限访问的信息,然后给出对应的提示。

针对登录超时,重写commence方法,如果是ajax请求则给出对应提示,若不是则重定向到登录页面:


爱测未来开发-SpringSecurity实战

针对无权限访问,重写handle方法,如果是ajax请求则给出对应提示,若不是则重定向到无权限访问页面:

爱测未来开发-SpringSecurity实战

然后在统一的js中处理抓取到的登录超时以及无权限访问的信息,给出对应提示:

爱测未来开发-SpringSecurity实战



以上是针对spring-security的一些认识,后续也会在这方面继续一些深入的研究学习,有兴趣的同学可以一起加入学习,如有不妥之处欢迎批评指正,感谢阅读。


公众号:itest_forever

爱测未来开发-SpringSecurity实战

CSDN:http://blog.csdn.net/itest_2016

QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)

科大讯飞合肥测试技术嘉年华第三届正在火热报名中,想要提升技术的朋友千万不要错过哦,赶快加入我们报名吧。