gpt4 book ai didi

java - Spring:通过java配置在Controller层启用全局方法安全

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:58 26 4
gpt4 key购买 nike

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

下面的配置是我的servlet 配置,它在 Controller 层启用自定义安全注释。

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

<bean id="expressionHandler" class="yyy.MyMethodSecurityExpressionHandler" />

我也有一个工作的 spring security xml 配置,这是为了用 java 配置替换,但不是现在。这是我的一些安全配置:

<bean id="authenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userDetailsService" />
</bean>

<bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<constructor-arg>
<ref bean="authenticationProvider"/>
</constructor-arg>
</bean>

<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsService" />
</security:authentication-manager>

<security:global-method-security pre-post-annotations="enabled" />

我想开始迁移我的 servlet 配置,在 Controller 层启用安全性 @PreAuthorize@PostAuthorize 标签。

我找到了这个注解:@EnableGlobalMethodSecurity(prePostEnabled=true),但是把它放在我的 servlet 配置上:

@Configuration
@ComponentScan(basePackages= {
"....."
})
@EnableGlobalMethodSecurity(prePostEnabled=true)

public class WebappServletConfig extends WebMvcConfigurationSupport {

我得到这个异常:

java.lang.IllegalArgumentException: Expecting to only find a single bean for type interface org.springframework.security.authentication.AuthenticationManager, but found []

而且我不知道如何设置我的自定义表达式处理程序!

有人有一些提示吗?谢谢

最佳答案

更新(更新问题后)

您似乎遇到了 SEC-2479 .有几种解决方法。其中最简单的方法是对 AuthenticationManager 使用 @Autowired 的结果。为此,您必须扩展 GlobalMethodSecurityConfiguration 并覆盖 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 的安全性,则 reference provides an example如何配置方法安全表达式处理程序。

@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;
}
}

关于java - Spring:通过java配置在Controller层启用全局方法安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21554075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com