Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring:通过java配置在控制器层启用全局方法安全性_Java_Spring_Spring Mvc_Spring Security_Spring Java Config - Fatal编程技术网

Spring:通过java配置在控制器层启用全局方法安全性

Spring:通过java配置在控制器层启用全局方法安全性,java,spring,spring-mvc,spring-security,spring-java-config,Java,Spring,Spring Mvc,Spring Security,Spring Java Config,我正在尝试将xml servlet配置迁移到java配置 下面的配置是我的servlet配置,它在控制器层上启用自定义安全注释 <security:global-method-security pre-post-annotations="enabled"> <security:expression-handler ref="expressionHandler"/> </security:global-method-security> <bean

我正在尝试将xml servlet配置迁移到java配置

下面的配置是我的servlet配置,它在控制器层上启用自定义安全注释

<security:global-method-security pre-post-annotations="enabled">
    <security:expression-handler ref="expressionHandler"/>
</security:global-method-security>

<bean id="expressionHandler" class="yyy.MyMethodSecurityExpressionHandler" />
我得到一个例外:

java.lang.IllegalArgumentException: Expecting to only find a single bean for type interface org.springframework.security.authentication.AuthenticationManager, but found []
此外,我不知道如何设置我的自定义表达式处理程序


有人给你小费吗?谢谢

首先,您需要一个单独的配置类,如

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {...
你需要定义的地方

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService);
}
这应该对你的例外情况有所帮助

我不确定如何配置expressionHandler,但您似乎可以在configure(WebSecurity web)中对其进行调整

更新(更新问题后)

看来你遇到了。有几种方法可以解决这个问题。最简单的方法是将@Autowired的结果用于AuthenticationManager。为此,必须扩展GlobalMethodSecurity配置并重写authenticationManager方法

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Autowired
    private AuthenticationManager am;

    @Override
    protected AuthenticationManager authenticationManager() {
        return am;
    }
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        // ... create and return custom MethodSecurityExpressionHandler ...
        return expressionHander;
    }
}
原始答案

您需要配置某种身份验证。因此,您需要具备以下条件:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
}
如果未使用基于web的安全性,则说明如何配置方法安全性表达式处理程序

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        // ... create and return custom MethodSecurityExpressionHandler ...
        return expressionHander;
    }
}
如果您只希望自定义方法表达式处理程序提供权限计算器,则只需创建如下PermissionEvaluator bean:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
    @Bean
    public PermissionEvaluator permissionEvaluator() {
        // ... create and return custom PermissionEvaluator ...
        return permissionEvaluator;
    }
}

受保护的配置方法仅与WebSecurityConfigureAdapter隔离(这就是方法作用域受保护的原因)。这意味着全局方法安全支持将找不到身份验证。相反,应该按照我的示例中所示配置全局身份验证。另外请注意,这里的表达式处理程序是用于web的,而不是用于方法级别的安全性。谢谢您的回答。我已经有了一个xml格式的spring安全配置。它将被翻译,但不是现在。我不仅想将前/后授权标签扩展到控制器层..谢谢你的回答。我已经有了一个xml格式的spring安全配置。它将被翻译,但不是现在。我不仅想将预/后授权标记扩展到控制器层..您是如何定义AuthenticationManager的?
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
}
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        // ... create and return custom MethodSecurityExpressionHandler ...
        return expressionHander;
    }
}
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
    @Bean
    public PermissionEvaluator permissionEvaluator() {
        // ... create and return custom PermissionEvaluator ...
        return permissionEvaluator;
    }
}