我们正在开发 Spring 4 REST/JSON API,但我们需要自定义身份验证服务来针对第 3 方服务进行身份验证。
限制:我们不想要求用户提供用户名/密码。我们正在使用“cookie”(与请求发起者一起发送)进行身份验证。我们需要在后台执行此身份验证过程。 (可能听起来很奇怪,但事实就是如此)。
我们可以使用注册自定义身份验证/授权请求过滤器来实现它。但这使我们失去了我们计划在以后使用的 spring“授权”模块的功能。
到目前为止,我们所做的是使用我们自己的自定义 AuthenticationProvider 和 UserDetailsService 编写自定义 WebSecurityConfigurerAdapter,但这些配置似乎不起作用.
应用程序没有进入AuthenticationProvider.authenticate
这是我们的配置。
AuthenticationProvider.java:
@Service
public class AuthenticationService implements AuthenticationProvider, UserDetailsService {
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
// DOESN'T ENTER THIS FUNCTION
// do authentication stuff
}
@Override
public boolean supports(Class<?> authentication) {
// JUST FOR TESTING
return true;
}
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
// DOESN'T ENTER THIS METHOD
return null;
}
}
安全配置.java:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private static final Logger LOGGER = LoggerFactory.getLogger(SecurityConfig.class);
@Autowired
private AuthenticationService authService;
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/ignoredURL/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() //HTTP with Disable CSRF
.authorizeRequests()
.antMatchers("/api/XYZ/**").hasRole("ADMIN")
.anyRequest().authenticated();
// adding ".httpBasic()" automatically prompts user for username/password
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// THIS IS NOT TYPO, I use one service implements both interfaces.
auth.userDetailsService(authService);
auth.authenticationProvider(authService);
}
}
最佳答案
通过添加 2 个以上的类(过滤器扩展 AbstractPreAuthenticatedProcessingFilter
和另一个类 CustomUser
实现 UserDetails
)修复,然后制作我的 AuthenticaitonService
实现 spring UserDetailsService
这里是细节:
请看what this filter does and how it works
1- 创建 AbcFilter
extends spring AbstractPreAuthenticatedProcessingFilter
2- 覆盖“getPreAuthenticatedPrincipal”。此方法提取 cookie
值并将其返回。 (无论您在此处返回什么对象,您都将在 UserDetailsService.loadUserByUsername
中作为参数获得)。
3- 修改我的服务以实现 spring UserDetailsService
并在 loadUserByUsername
中执行所有身份验证逻辑并在 CustomUser
对象中设置所有登录用户.然后归还。
4- 每当请求匹配 /api/XYZ/**
时,Spring 将调用您的 CustomUser.getAuthorities
并尝试找到 ADMIN
角色那里。
关于java - Spring Security 4. 具有自定义身份验证和授权的 JSON REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38589635/