∙Lingo--Spring Security 安全权限管理手册
∙江南白衣知识库--SpringSecurity资料
∙京山游侠--SpringSide 3 中的安全框架
2.选型
SpringSecurity(Acegi)算是一个比较全面的安全框架,而JAAS的概念抽象虽然严整,但具体实现太多要自己DIY的地方,而轻量级如Shiro最近除了不停改名外没什么发展(Shiro的介绍)。
3. in SpringSide 3.0
3.1 登录
使用SpringSecurity自带的Login/Logout、RememerMe机制,自己实现UserDetailService接口负责查询数据库向SpringSecurity提供身份和授权信息。
密码可用明文,也可用SHA1散列后存放, 还可控制同时相同登陆的,(见showcase的applicationcontext-security.xml).
3.2 用户-角色-授权控制
SpringSecurity只关心用户与授权 ,可以在中间加一层角色,一般三者及之间的关系都存储在数据库里。
3.2 基于授权的资源控制
1.在applicationContext-security.xml中配置URL访问控制。
2.在JSP中使用taglib控制页面显示内容。
3.在POJO中使用annotation控制函数访问.
SpringSide不再建议将URL与授权的关系定义到数据库。
3.3 验证码集成
在SpringSecurity中内部集成验证码并不方便,因此在外部编写一个验证码Filter,对SpringeScurity的login form提交地址j_security_check进行拦截,实现松耦合的集成.
详见验证码-JCaptcha
3.4 扩展User属性
扩展SpringSecurity的User类,加入loginTime,loginIP等属性。将UserDetailServiceImpl的loadUserByUsername(String userName)的返回值改为新类型,即可在SecurityContextHolder.getContext().getAuthentication().getPrincipal()随时取出该类并强制转型之。
3.5 与CXF的集成
SpringSide封装的SpringSecurityInInterceptor类,将WSS4J认证后的用户身份找出来放进SecurityContext里,见Showcase中的演示。
然后就可以AOP的形式,对CXF中的接口函数进行授权验证。
当然,调用结束时要SpringSecurityOutInterceptor类要将用户身份从ThreadLocal的SecurityContext中清除掉。
3.6 与Rest的集成
见Showcase中的演示,SpringSecurity本来就支持Http Basic/Digest的认证,所以只要在Rest客户端发送Http Basic/Digest的Http Header,SpringSecurity就可以验证用户身份,然后像CXF一样,用AOP控制接口的授权。
4. SpringSide3的封装
4.1 SpringSecurityUtils
∙获取当前用户/用户名的简便函数。
∙获取当前用户IP的简便函数, 将藏在Authentication的WebAuthenticationDetails中的IP找出来。
∙判断用户是否拥有某个角色的简便函数。
∙保存用户到SecurityContext。最重要函数!!!其他SSO 或 DIY认证方案实现与SpringSecurity集成的不二法门。