java - Spring Security 4. 具有自定义身份验证和授权的 JSON REST

标签 java spring-security java-8 spring-4 spring-rest

我们正在开发 Spring 4 REST/JSON API,但我们需要自定义身份验证服务来针对第 3 方服务进行身份验证。

限制:我们不想要求用户提供用户名/密码。我们正在使用“cookie”(与请求发起者一起发送)进行身份验证。我们需要在后台执行此身份验证过程。 (可能听起来很奇怪,但事实就是如此)。

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

到目前为止,我们所做的是使用我们自己的自定义 AuthenticationProviderUserDetailsS​​ervice 编写自定义 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 UserDetailsS​​ervice 这里是细节:

请看what this filter does and how it works

1- 创建 AbcFilter extends spring AbstractPreAuthenticatedProcessingFilter

2- 覆盖“getPreAuthenticatedPrincipal”。此方法提取 cookie 值并将其返回。 (无论您在此处返回什么对象,您都将在 UserDetailsS​​ervice.loadUserByUsername 中作为参数获得)。

3- 修改我的服务以实现 spring UserDetailsS​​ervice 并在 loadUserByUsername 中执行所有身份验证逻辑并在 CustomUser 对象中设置所有登录用户.然后归还。

4- 每当请求匹配 /api/XYZ/** 时,Spring 将调用您的 CustomUser.getAuthorities 并尝试找到 ADMIN 角色那里。

关于java - Spring Security 4. 具有自定义身份验证和授权的 JSON REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38589635/

相关文章:

java - 消除接受不同功能接口(interface)的重载方法的歧义

Java 重复类错误 - 没有重复的类

java - 关于 Java 的前置和后置。没有生效?

java - 在没有 AbstractSecurityWebApplicationInitializer 的情况下启用 Spring Security

Spring Boot OAuth2 手动创建新的 JWT token

java - 如何将 Spring Boot 配置为 .war 文件以及安全性?

java - Eclipse 条件断点不起作用

java - 将 URL 路径与查询字符串匹配

java - 我的 ArrayList 中的 .add 有什么问题?

java - 使用 Java8 流实现此集合的最佳方式