Spring security Spring,security,boot,WebSecurity配置适配器-拦截URL';通过在数据库中查找动态

Spring security Spring,security,boot,WebSecurity配置适配器-拦截URL';通过在数据库中查找动态,spring-security,spring-java-config,Spring Security,Spring Java Config,我是Spring、SpringSecurity和Boot的新手—尝试创建一个Web应用程序,在其中我必须在数据库中查找用户是否有权访问请求的URL。我已设法使身份验证工作正常(即使用loadUserByUsername的UserDetailService)。在数据库中,我有一个用于用户、组、角色的表,最后一个用于包含URL和配置属性(通常等于角色)的URL 所以我有这样的工作配置(顺便说一句,我试图用Java配置所有东西,而不是使用XML): 现在,我尝试用以下内容替换上述所有蚂蚁匹配器:

我是Spring、SpringSecurity和Boot的新手—尝试创建一个Web应用程序,在其中我必须在数据库中查找用户是否有权访问请求的URL。我已设法使身份验证工作正常(即使用loadUserByUsername的UserDetailService)。在数据库中,我有一个用于用户、组、角色的表,最后一个用于包含URL和配置属性(通常等于角色)的URL

所以我有这样的工作配置(顺便说一句,我试图用Java配置所有东西,而不是使用XML):

现在,我尝试用以下内容替换上述所有蚂蚁匹配器:

        .anyRequest().authenticated()
    .withObjectPostProcessor(new ObjectPostProcessor<MyFilterSecurityMetadataSource>() {
        @Override
        public <O extends MyFilterSecurityMetadataSource> O postProcess(O object) {
            object.getAttributes(object);
            FilterInvocationSecurityMetadataSource metadataSource = new MyFilterSecurityMetadataSource();
            if (object instanceof FilterInvocationSecurityMetadataSource) {
                return (O) metadataSource.getAttributes(object);
            }
            return null;
        }
    }).anyRequest().denyAll();
.anyRequest().authenticated())
.withObjectPostProcessor(新的ObjectPostProcessor(){
@凌驾
公共O后处理(O对象){
getAttributes(对象);
FilterInvocationSecurityMetadataSource metadataSource=新的MyFilterSecurityMetadataSource();
if(FilterInocationSecurityMetaDataSource的对象实例){
返回(O)metadataSource.getAttributes(对象);
}
返回null;
}
}).anyRequest().denyAll();
MyFilterSecurityMetadataSource如下所示(我还没有进行实际的查找-我很难找到这个过滤器):

公共类MyFilterSecurityMetadataSource实现FilterInvocationSecurityMetadataSource{
公共列表getAttributes(对象){
FilterInvocation fi=(FilterInvocation)对象;
字符串fullRequestUrl=fi.getFullRequestUrl();
String requestUrl=fi.getRequestUrl();
字符串httpMethod=fi.getRequest().getMethod();
字符串contextPath=fi.getRequest().getContextPath();
System.out.println(“完整请求URL:+fullRequestUrl”);
System.out.println(“请求URL:+requestUrl”);
System.out.println(“HTTP方法:+httpMethod”);
System.out.println(“上下文路径:“+contextPath”);
List configAttributes=new ArrayList(0);
//使用此信息查找数据库(或其他源),并填充
//属性列表
返回配置属性;
}
公共集合getAllConfigAttributes(){
返回null;
}
公共布尔支持(类clazz){
返回FilterInvocation.class.isAssignableFrom(clazz);
}
}

也许我需要配置一个
FilterSecurityInterceptor
,而不是
MyFilterSecurityMetadataSource
,并将其传递给FilterSecurityInterceptor,我不知道。但我必须使用决策经理roleVotes bla。布拉。我不明白。很难找到关于这个特定主题的工作样本。很抱歉,我的编程技能糟透了:)

您在错误的对象上安装了后处理器。请用以下命令重写后处理器

.anyRequest().authenticated().withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    public <O extends FilterSecurityInterceptor> O postProcess(
                            O fsi) {
                        FilterInvocationSecurityMetadataSource newSource = new MyFilterSecurityMetadataSource();
                        fsi.setSecurityMetadataSource(newSource);
                        return fsi;
                    }
                })
.anyRequest().authenticated().withObjectPostProcessor(新的ObjectPostProcessor()){
公共O后处理(
O(金融服务机构){
FilterInvocationSecurityMetadataSource newSource=新建MyFilterSecurityMetadataSource();
fsi.setSecurityMetadataSource(newSource);
返回fsi;
}
})

有几个SO主题,但没有人帮助:Spring文档,也无法实现此功能:。可能是因为它的底部有一个xml配置文件,我不知道如何使用它。你能解释一下在getAttributes方法中应该写什么而不是注释吗?URL列表?角色列表?它们之间的映射?另一个问题是:我可以使用这个解决方案根据用户名和密码配置授权吗?亲爱的Arun。非常感谢您提供了这个简单的解决方案。说真的,我什么都试过了(甚至连考虑周全的决策经理、选民等等)。我刚刚尝试了你的解决方案,现在我可以看到正在调用URL。我将继续执行我的原始计划,在数据库中查找它以返回有效的配置属性。非常感谢。
public class MyFilterSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {

public List<ConfigAttribute> getAttributes(Object object) {
    FilterInvocation fi = (FilterInvocation) object;
    String fullRequestUrl = fi.getFullRequestUrl();
    String requestUrl = fi.getRequestUrl();
    String httpMethod = fi.getRequest().getMethod();
    String contextPath = fi.getRequest().getContextPath();
    System.out.println("Full request URL: " + fullRequestUrl);
    System.out.println("Request URL: " + requestUrl);
    System.out.println("HTTP Method: " + httpMethod);
    System.out.println("Context path: " + contextPath);
    List<ConfigAttribute> configAttributes = new ArrayList<ConfigAttribute>(0);
    // Lookup your database (or other source) using this information and populate the
    // list of attributes

    return configAttributes;
}

public Collection<ConfigAttribute> getAllConfigAttributes() {
    return null;
}

public boolean supports(Class<?> clazz) {
    return FilterInvocation.class.isAssignableFrom(clazz);
}
}
.anyRequest().authenticated().withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    public <O extends FilterSecurityInterceptor> O postProcess(
                            O fsi) {
                        FilterInvocationSecurityMetadataSource newSource = new MyFilterSecurityMetadataSource();
                        fsi.setSecurityMetadataSource(newSource);
                        return fsi;
                    }
                })