我爱编程Spring Security

SecurityConfiguration 中注入自定义 bea

2018-05-22  本文已影响40人  赛亚人之神

使用 Spring Security 的四种方式

1. 全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中;

2. 用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置。

3. 细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,
并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,
并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,
并在配置文件中进行相应配置。目前这种方式已经实现,并经过验证。

4. 修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。
前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,
后者提取用户名和权限组成一个完整的(UserDetails)User对象,
对象可以提供用户的详细信息供AuthentationManager进行认证与授权使用。

这里测试使用第三种:参考资料来源

  1. 官方文档
  2. 博客等

5.11 Post Processing Configured Objects

Spring Security’s Java Configuration does not expose every property of every object that it configures. 
This simplifies the configuration for a majority of users. Afterall, 
if every property was exposed, users could use standard bean configuration.

While there are good reasons to not directly expose every property, 
users may still need more advanced configuration options. 
To address this Spring Security introduces the concept of an ObjectPostProcessor 
which can be used to modify or replace many of the Object instances created by the Java Configuration. 
For example, if you wanted to configure the filterSecurityPublishAuthorizationSuccess property 
on FilterSecurityInterceptor you could use the following:

以下来自谷歌翻译


5.11后处理配置的对象
Spring Security的Java配置不公开它配置的每个对象的每个属性。 
这简化了大多数用户的配置。 最后,如果每个属性都暴露出来,用户可以使用标准的bean配置。

尽管没有直接公开每个属性的很好理由,但用户可能仍然需要更高级的配置选项。 
为了解决这个问题,Spring Security引入了ObjectPostProcessor的概念,
该概念可用于修改或替换由Java配置创建的许多Object实例。 
例如,如果您想在FilterSecurityInterceptor上配置filterSecurityPublishAuthorizationSuccess属性,则可以使用以下内容:
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                public <O extends FilterSecurityInterceptor> O postProcess(
                        O fsi) {
                    fsi.setPublishAuthorizationSuccess(true);
                    // 在我们自己的项目中使用了如下两行,替换了accessDecisionManager 和 securityMetadataSource,也就是如上面所说的用 ObjectPostProcessor 来修改或替换由Java配置创建的许多Object实例,也可以直接在自定义的filter中定义
                    // fsi.setAccessDecisionManager(accessDecisionManager();
                    // fsi.setSecurityMetadataSource(securityMetadataSource());
                    return fsi;
                }
            });
}
上一篇下一篇

猜你喜欢

热点阅读