gpt4 book ai didi

java - 将自定义身份验证包装到 Spring 安全性中的最简单方法?

转载 作者:行者123 更新时间:2023-11-30 08:06:18 25 4
gpt4 key购买 nike

假设我有一个简单的 bean,它可以通过密码验证用户并且还知道任何指定用户的角色:

interface MyBeanInterface {
boolean check(String username, String password);
List<String> roles(String username);
}

将此功能插入具有基本 HTTP 安全性的 Spring Web 应用程序的最简单方法是什么?

同时,我想仅使用 @Secured 注释来注释我的 Controller 和服务方法。没有任何点分隔谓词 like here ,请。

我攻不破Spring Security API中那无数的“populators”、“managers”、“adapters”等“configurers”……

更新

我写道:

1) 从 Controller 返回的 Greeting

2) 一个 GreetingController 类来处理网络请求 /greeting1/greeting2。我用 @Secured({"USER", "ADMIN"}) 注释了第一个方法,用 @Secured({"ADMIN"}) 注释了第二个方法。

3) 我编写了 MyAuthService,我在其中对两个具有不同访问级别的用户进行了身份验证。

4) 我编写了 AuthenticationProviderEx,其中通过调用 MyAuthService bean 实现了 authenticate() 方法。

5) 我编写了 SecurityConfig bean,其中 configure() 返回我的提供商。

密码是here in commit fdc2466 .在这种状态下,它根本不要求身份验证。

更新 2

我已将 @EnableGlobalMethodSecurity(securedEnabled = true) 添加到 SecurityConfig 类,它开始询问用户名和密码,但不幸的是,返回错误 403 根据任何请求。

最佳答案

在您的界面周围制作一个自定义身份验证提供程序包装器,例如:

@Component("customAuthenticationProvider")
public class CustomAuthenticationProvider implements AuthenticationProvider {

@Autowired
private MyBeanInterface myInterface;

public Authentication authenticate(Authentication authentication) {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
if (!myInterface.check(username, password)) {
throw new BadCredentialsException("Bad username or password.");
}
List<GrantedAuthority> authorities = new ArrayList<>();
for (String role : myInterface.roles(username)) {
authorities.add(new SimpleGrantedAuthority(role));
}
return new UsernamePasswordAuthenticationToken(username, password, authorities);
}

public boolean supports(Class<?> clazz) {
return UsernamePasswordAuthenticationToken.class.equals(clazz);
}

}

并通过 XML 在您的安全配置中使用它:

<authentication-manager>
<authentication-provider ref="customAuthenticationProvider"/>
</authentication-manager>

更新:也适用于 java 配置:

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private CustomAuthenticationProvider customAuthenticationProvider;

@Override
protected void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(customAuthenticationProvider);
}

/* rest of security config here */
}

其余的都是很正常的东西。

关于java - 将自定义身份验证包装到 Spring 安全性中的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471335/

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