代码之家  ›  专栏  ›  技术社区  ›  Hilton Campbell

如何确定用Spring Security访问URL所需的角色?

  •  5
  • Hilton Campbell  · 技术社区  · 16 年前

    我正在使用spring security来保护一个webapp。URL的安全性如下:

    <security:http entry-point-ref="authenticationEntryPoint">
      <security:intercept-url pattern="/" access="ROLE_ANONYMOUS" />
      <security:intercept-url pattern="/assets/**/*" access="ROLE_ANONYMOUS" />
      ...
      <security:intercept-url pattern="/**" access="ROLE_USER" />
      <security:anonymous granted-authority="ROLE_ANONYMOUS" />
    </security:http>
    

    我有一个过滤器,在某些情况下需要将用户重定向到特殊页面。但是,该页面需要资产目录中的图像和css文件,不幸的是,这些文件也将被重定向到该特殊页面。我不希望过滤器手动检查每个url模式,因为我的实际url配置要长得多,而且我还希望允许其他页面。

    是否有方法从给定页面的筛选器中确定需要哪些角色?如果不需要匿名角色,我可以选择不重定向。

    2 回复  |  直到 12 年前
        1
  •  3
  •   Shaun the Sheep    15 年前

    假设您使用的是SpringSecurity3,那么信息的来源(为特定路径配置了哪些属性/角色)是注入到FilterSecurityInterceptor中的FilterInvocationSecurityMetadatasource。因此,如果您有一个特定的URL,那么您可以通过将FieldCutoOutlook(从请求和响应创建)传递到FieldVoCutoSturalSturyMeta数据源的GETAtestTeX()方法来查询所配置的属性。

    获取对命名空间创建的内部bean的引用可能有点棘手。假设您有自己的bean(或bean)要从中调用,可以通过将BeaPress处理器添加到应用程序上下文中,将其注入到它们中,实现了如下内容:

    public class FilterSecurityMDSExtractor implements BeanPostProcessor, BeanFactoryAware {
        private ConfigurableListableBeanFactory bf;
    
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof FilterInvocationSecurityMetadataSource) {
                // Get your own bean from the BeanFactory here and inject the SecurityMetadataSource into it
            }
            return bean;
        }
    
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }    
    
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.bf = (ConfigurableListableBeanFactory)beanFactory;
        }   
    }
    

    注意,Spring Security在上下文中自动注册WebViuCasePrimeError,可以用来检查用户是否有能力调用一个特定的URL而不实际调用它。这是类似的,因为它查询securitymetadatasource,但不完全是在这里。

        2
  •  2
  •   Andrzej Doyle    16 年前

    不要忘记,在决定是否允许访问时,实际发生的情况是url和现有的身份验证通过一系列 AccessDecisionVoter s,其中一个默认值是 RoleVoter 。此投票者检查所请求资源的配置,如果需要特定角色,则在现有身份验证不具有该角色时将拒绝该请求。

    因此,你可以在选民投票前加入其他选民。每个投票者必须返回grant、deny或弃权,并且只有在返回弃权时,处理过程才会继续到以后的投票者。因此,您可以编写您自己的自定义选民(或重用现有的一个,如果这将工作),让它在角色选民之前开火,并且无条件地授予对您所指资源的任何请求的访问权。

    在一个当前的项目中,我做了一些类似的事情,在某些项目中,特定的临时应用程序属性可以让人访问他们通常无法访问的资源,并且它作为一种方法工作得很好。