SpringSide 3 中的安全框架

标签: springside 安全 框架 | 发表时间:2013-06-01 11:03 | 作者:javaACMer
出处:http://blog.csdn.net

转载 : http://www.blogjava.net/youxia/archive/2008/12/07/244883.html

在SpringSide 3的官方文档中,说安全框架使用的是Spring Security 2.0。乍一看,吓了我一跳,以为Acegi这么快就被淘汰了呢。上搜索引擎一搜,发现原来Spring Security 2.0就是Acegi 2.0。悬着的心放下来了。虽然SpringSide 3中关于Acegi的配置文件看起来很不熟悉,但是读了Acegi 2.0的官方文档后,一切都释然了。

先来谈一谈Acegi的基础知识,Acegi的架构比较复杂,但是我希望我下面的只言片语能够把它说清楚。大家都知道,如果要对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。Acegi对Web资源的保护,就是靠Filter实现的。如下图:
001.PNG

一般来说,我们的Filter都是配置在web.xml中,但是Acegi不一样,它在web.xml中配置的只是一个代理,而真正起作用的Filter是作为Bean配置在Spring中的。web.xml中的代理依次调用这些Bean,就实现了对Web资源的保护,同时这些Filter作为Bean被Spring管理,所以实现AOP也很简单,真的是一举两得啊。

Acegi中提供的Filter不少,有十多个,一个一个学起来比较复杂。但是对于我们Web开发者来说,常用的就那么几个,如下图中的被红圈圈标记出来的:
002.PNG

从上到下,它们实现的功能依次是1、制定必须为https连接;2、从Session中提取用户的认证信息;3、退出登录;4、登录;5、记住用户;6、所有的应用必须配置这个Filter。

一般来说,我们写Web应用只需要熟悉这几个Filter就可以了,如果不需要https连接,连第一个也不用熟悉。但是有人肯定会想,这些Filter怎么和我的数据库联系起来呢?不用着急,这些Filter并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器和决策管理器。如下图:
003.PNG

对于这两种管理器,那也是不需要我们写代码的,Acegi也提供了现成的类。那么大家又奇怪了:又是现成的,那怎么和我的数据库关联起来呢?别着急,其实这两个管理器自己也不做事,认证管理器把任务交给了Provider,而决策管理器则把任务交给了Voter,如下图:
004.PNG

现在我要告诉你们,这里的Provider和Voter也是不需要我们写代码的。不要崩溃,快到目标了。Acegi提供了多个Provider的实现类,如果我们想用数据库来储存用户的认证数据,那么我们就选择DaoAuthenticationProvider。对于Voter,我们一般选择RoleVoter就够用了,它会根据我们配置文件中的设置来决定是否允许某一个用户访问制定的Web资源。

而DaoAuthenticationProvider也是不直接操作数据库的,它把任务委托给了UserDetailService,如下图:
005.PNG

而我们要做的,就是实现这个UserDetailService。图画得不好,大家不要见笑,但是说了这么多总算是引出了我们开发中的关键,那就是我们要实现自己的UserDetailService,它就是连接我们的数据库和Acegi的桥梁。UserDetailService的要求也很简单,只需要一个返回org.springframework.security.userdetails.User对象的loadUserByUsername(String userName)方法。因此,怎么设计数据库都可以,不管我们是用一个表还是两个表还是三个表,也不管我们是用户-授权,还是用户-角色-授权,还是用户-用户组-角色-授权,这些具体的东西Acegi统统不关心,它只关心返回的那个User对象,至于怎么从数据库中读取数据,那就是我们自己的事了。

反过来再看看上面的过程,我们发现,即使我们要做的只是实现自己的UserDetailService类,但是我们不得不在Spring中配置那一大堆的Bean,包括几个Filter,几个Manager,几个Provider和Voter,而这些配置往往都是重复的无谓的。好在Acegi 2.0也认识到了这个问题,所以,它设计了一个<http>标签,让Acegi的配置得到了简化。下面是SpringSide 3中的配置的截图,大家可以看看:
006.PNG

下图是官方文章中的传统Filter设置和<http>元素之间的对应关系:
007.PNG

下面的代码是SpringSide 3中实现UserDetailService的范例,在SpringSide 3的范例中,白衣使用了三个表User、Role、Authority。但是Acegi不关心你用了几个表,它只关心UserDetails对象。而决定用户能否访问指定Web资源的,是RoleVoter类,无需任何修改它可以工作得很好,唯一的缺点是它只认ROLE_前缀,所以搞得白衣的Authority看起来都象角色,不伦不类。

package personal.youxia.service.security;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Required;
import org.springframework.dao.DataAccessException;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;
import personal.youxia.entity.user.Authority;
import personal.youxia.entity.user.Role;
import personal.youxia.entity.user.User;
import personal.youxia.service.user.UserManager;

/**
 * 实现SpringSecurity的UserDetailsService接口,获取用户Detail信息.
 * 
 * @author calvin
 */
public class UserDetailServiceImpl implements UserDetailsService {

    private UserManager userManager;

    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {
        User user = userManager.getUserByLoginName(userName);
        if (user == null)
            throw new UsernameNotFoundException(userName + " 不存在");

        List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>();

        for (Role role : user.getRoles()) {
            for (Authority authority : role.getAuths()) {
                authsList.add(new GrantedAuthorityImpl(authority.getName()));
            }
        }

        // 目前在MultiDatabaseExample的User类中没有enabled, accountNonExpired,credentialsNonExpired, accountNonLocked等属性
        // 暂时全部设为true,在需要时才添加这些属性.
        org.springframework.security.userdetails.User userdetail = new org.springframework.security.userdetails.User(
                user.getLoginName(), user.getPassword(), true, true, true, true, authsList
                        .toArray(new GrantedAuthority[authsList.size()]));

        return userdetail;
    }

    @Required
    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
}


最后再来说说这个命名的问题,我对Authentication和Authority这两个单词比较反感,两个原因,一是因为它们太生僻了,二是因为它们长得太像了,明明一个是认证,一个是授权,意思相差很远,外貌却如此相似,确实很烦人。如果让我来选择,我喜欢Privilege这个单词,在我刚使用MySQL的时候就跟它很熟了,所以在我的项目中,我可能会用Privilege来代替Authority。如果我们只使用User-Role两级关系,使用RoleVoter默认的ROLE_前缀当然没有关系,如果是像白衣这样是用三层关系,最好还是把这个前缀改一改,以免混淆。
作者:javaACMer 发表于2013-6-1 11:03:50 原文链接
阅读:107 评论:0 查看评论

相关 [springside 安全 框架] 推荐:

SpringSide 3 中的安全框架

- - CSDN博客架构设计推荐文章
转载 : http://www.blogjava.net/youxia/archive/2008/12/07/244883.html. 在SpringSide 3的官方文档中,说安全框架使用的是Spring Security 2.0. 乍一看,吓了我一跳,以为Acegi这么快就被淘汰了呢. 上搜索引擎一搜,发现原来Spring Security 2.0就是Acegi 2.0.

Web开发框架安全杂谈

- goodman - 80sec
最近框架漏洞频发,struts任意代码执行、Django csrf token防御绕过、Cakephp代码执行等等各大语言编程框架都相继暴出高危漏洞,这说明对于编程框架的安全问题已经逐渐走入安全工作者的视线. Web开发框架就相当于web应用程序的操作系统,他决定了一个应用程序的模型结构和编程风格.

8个网络安全开源框架

- - HTML5资源教程
能帮助构建、操作安全系统的开源项目多到数不清,尤其是随着对工具的安全监控和事件反应的要求不断加强的情况下,开源安全软件不得不提高自己的性能. 下面为你介绍10款开源的安全软件. Bro 是一款很强大的框架,用于网络分析和安全监控,它和常见的IDS有所不同. 与通用的网络传输分析工具相比它侧重于网络安全监控和提供一个完整的平台化工具.

安全专家称Duqu是定制攻击框架

- ArmadilloCommander - Solidot
赛门铁克上周报告发现了类似Stuxnet的工业系统恶意程序Duqu,但关于Duqu是未来Stuxnet的说法模糊了这种新恶意程序的许多真相. Duqu本质上是一种定制攻击框架,能为每个目标打造独立攻击模块. 卡巴斯基的安全研究员Alex Gostev详细分析了Duqu文件,发现恶意程序为每个目标使用了不同的驱动和模块.

最好的Android安全测试框架 – Drozer

- - FreeBuf.COM
drozer是一款针对Android系统的安全测试框架. drozer可以帮助Android app和设备变得更安全,其提供了很多Android平台下的渗透测试exploit供你使用和分享. 对于远程的exploit,它可以生成shellcode帮助你进行远程设备管理. drozer可以大大缩减Android安全评估的耗时,通过攻击测试暴露Android APP的漏洞.

使用Xenotix_XSS框架进行自动化安全测试

- - FreeBuf.COM
本文简单的介绍Xenotix_XSS框架常用的xss测试自动测试工具,可以用于对页面进行自动安全扫描. 点击“setting—>configure server—>start”,服务器就配置完成. scanner里面的”get request manualmode”是手动测试,即每次点击start的时候,只会执行一个payload,而”get request auto mode”是自动测试,设置时间间隔,就可以自动扫描.

MobSF:一款功能强大的智能移动安全框架

- - FreeBuf.COM | 关注黑客与极客
今天给大家介绍的是一款名叫MobSF的移动安全框架,这是一款功能多合一型的智能框架,它不仅可以对移动端应用程序(Android/iOS/Windows Phone)进行自动化的渗透测试(包括静态测试和动态分析),并且还能够对Web API进行测试. Mobile Security Framework(MobSF)可以对Android、iOS和Windows端移动应用进行快速高效的安全分析,不仅支持APK、IPA和APPX等格式的应用程序,而且还可以对压缩包内的源代码进行安全审计.

PHP框架 Yaf

- Le - 开源中国社区最新软件
Yaf是一个C语言编写的PHP框架,Yaf 的特点: 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存. 更短的内存周转周期, 提高内存利用率, 降低内存占用率. 支持全局和局部两种加载规则, 方便类库共享.

微服务框架-基础框架

- - 人月神话的BLOG
上面一篇文章对SpringBoot框架做了一下简单验证,在文中也写到SpringBoot重点还是在单个微服务模块的开发,已经对于微服务接口开放的便捷性上,而对于微服务基础架构和管控治理层面没有太多支持. 对于微服务基础框架可以看作是微服务治理架构的核心内容,包括了对微服务模块的全生命周期管理能力,这个能力包括了微服务网关APP,DevOps,Docker和云集成,安全,负载均衡,服务注册和发现等诸多能力.

Shiro权限框架

- If you are thinking one year ahead, you plant rice. If you are thinking twenty years ahead, you plant trees. If you are thinking a hundred years ahead, you educate people. - BlogJava-首页技术区
开发系统中,少不了权限,目前java里的权限框架有SpringSecurity和Shiro(以前叫做jsecurity),对于SpringSecurity:功能太过强大以至于功能比较分散,使用起来也比较复杂,跟Spring结合的比较好. 对于初学Spring Security者来说,曲线还是较大,需要深入学习其源码和框架,配置起来也需要费比较大的力气,扩展性也不是特别强.