Java 如何确定使用Spring Security访问URL需要哪些角色?
我正在使用Spring Security保护一个Web应用程序。URL的安全性如下所示:Java 如何确定使用Spring Security访问URL需要哪些角色?,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我正在使用Spring Security保护一个Web应用程序。URL的安全性如下所示: public class FilterSecurityMDSExtractor implements BeanPostProcessor, BeanFactoryAware { private ConfigurableListableBeanFactory bf; public Object postProcessBeforeInitialization(Object bean, Stri
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;
}
}
...
我有一个过滤器,在某些情况下需要将用户重定向到特殊页面。但是,该页面需要assets目录中的图像和CSS文件,不幸的是,这些文件也会被重定向到该特殊页面。我不希望过滤器手动检查每个URL模式,因为我的实际URL配置要长得多,而且我还希望允许其他页面
是否有办法从给定页面的筛选器中确定需要哪些角色?如果不需要匿名角色,我可以选择不重定向。请不要忘记,在决定是否允许访问时,实际发生的情况是URL和现有身份验证通过一系列s传递,其中一个默认值是。此投票者检查所请求资源的配置,如果需要特定角色,如果现有身份验证没有该角色,则将拒绝该请求 因此,对于解决方案,您可以在角色投票者之前添加其他投票者。每个投票者必须返回GRANT、DENY或弃权,并且只有在返回弃权票时,后续投票者才能继续处理。因此,您可以编写自己的自定义投票者(或者重用现有的投票者,如果这样做可行的话),在角色投票者之前启动它,并无条件地授予对所引用资源的任何请求的访问权
我在当前的一个项目中做过类似的事情,在这个项目中,某些特定于应用程序的临时属性可以让某些人访问通常他们无法访问的资源,这是一种很好的方法。假设您使用的是Spring Security 3,该信息的来源(为特定路径配置的属性/角色)是注入FilterSecurityInterceptor的FilterInvocationSecurityMetadataSource。因此,如果您有特定URL,则可以通过将FilterInvocation(根据请求和响应创建)传递给getAttributes()来查询配置的属性筛选SecurityMetaDataSource的方法 获取由名称空间创建的内部bean的引用可能有点棘手。假设您有自己的bean(或多个bean)要从中进行调用,可以通过向应用程序上下文添加BeanPostProcessor将其注入其中,实现方式如下:
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会在上下文中自动注册WebInvocationPrivilegeEvaluator,该上下文可用于检查用户是否能够在不实际调用特定URL的情况下调用该URL。这与此类似,因为它会查询SecurityMetadataSource,但不完全是您要查询的内容。这是一个好主意,但是问题是,不管用户是否有访问权限,过滤器都会启动并重定向到特殊页面。我需要一些方法让过滤器知道什么时候不应该重定向,并且知道URL所需的角色就可以做到这一点。