Java 春季安全4。JSON REST具有自定义身份验证和授权
我们正在开发Spring4REST/JSONAPI,但我们需要定制身份验证服务来针对第三方服务进行身份验证 限制:我们不想询问用户用户名/密码。我们正在使用“cookie”(使用请求启动器发送)进行身份验证。我们需要在后台进行身份验证。(听起来可能很奇怪,但事实就是这样) 我们可以使用注册自定义身份验证/授权请求过滤器来实现这一点。但这使我们失去了spring“授权”模块的功能,我们计划在以后使用它 因此,我们到目前为止所做的是,使用我们自己的自定义身份验证提供程序和UserDetailsService编写自定义WebSecurity配置适配器,但这些配置似乎不起作用 应用程序未进入AuthenticationProvider.authenticate内部 这是我们的配置 AuthenticationProvider.java:Java 春季安全4。JSON REST具有自定义身份验证和授权,java,spring-security,java-8,spring-4,spring-rest,Java,Spring Security,Java 8,Spring 4,Spring Rest,我们正在开发Spring4REST/JSONAPI,但我们需要定制身份验证服务来针对第三方服务进行身份验证 限制:我们不想询问用户用户名/密码。我们正在使用“cookie”(使用请求启动器发送)进行身份验证。我们需要在后台进行身份验证。(听起来可能很奇怪,但事实就是这样) 我们可以使用注册自定义身份验证/授权请求过滤器来实现这一点。但这使我们失去了spring“授权”模块的功能,我们计划在以后使用它 因此,我们到目前为止所做的是,使用我们自己的自定义身份验证提供程序和UserDetailsSer
@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;
}
}
通过添加另外两个类(过滤器扩展
AbstractPreAuthenticatedProcessingFilter
和另一个类CustomUser
实现UserDetails
)进行修复,然后使我的authenticationservice
实现springUserDetails服务
以下是详细信息:
请看一看
1-创建AbcFilter
扩展springAbstractPreAuthenticatedProcessingFilter
2-覆盖“getPreAuthenticatedPrincipal”。此方法提取cookie
值并返回它。(这里返回的任何对象都是在UserDetailsService.loadUserByUsername
中作为参数得到的对象)
3-修改我的服务以实现springUserDetailsService
,并在loadUserByUsername
中执行所有身份验证逻辑,并在CustomUser
对象中设置所有登录的用户。然后把它还给我
4-每当请求与/api/XYZ/**
匹配时,Spring将调用您的CustomUser.getAuthories
,并尝试在那里找到ADMIN
角色
@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);
}
}