Java 春季安全4。JSON REST具有自定义身份验证和授权

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

我们正在开发Spring4REST/JSONAPI,但我们需要定制身份验证服务来针对第三方服务进行身份验证

限制:我们不想询问用户用户名/密码。我们正在使用“cookie”(使用请求启动器发送)进行身份验证。我们需要在后台进行身份验证。(听起来可能很奇怪,但事实就是这样)

我们可以使用注册自定义身份验证/授权请求过滤器来实现这一点。但这使我们失去了spring“授权”模块的功能,我们计划在以后使用它

因此,我们到目前为止所做的是,使用我们自己的自定义身份验证提供程序和UserDetailsService编写自定义WebSecurity配置适配器,但这些配置似乎不起作用

应用程序未进入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;
    }
}

通过添加另外两个类(过滤器扩展
AbstractPreAuthenticatedProcessingFilter
和另一个类
CustomUser
实现
UserDetails
)进行修复,然后使我的
authenticationservice
实现spring
UserDetails服务
以下是详细信息:

请看一看

1-创建
AbcFilter
扩展spring
AbstractPreAuthenticatedProcessingFilter

2-覆盖“getPreAuthenticatedPrincipal”。此方法提取
cookie
值并返回它。(这里返回的任何对象都是在
UserDetailsService.loadUserByUsername
中作为参数得到的对象)

3-修改我的服务以实现spring
UserDetailsService
,并在
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);
    }


}