java - Spring Security openId 支持和用户解除认证

标签 java jakarta-ee spring-security openid single-sign-on

我正在尝试处理这样一种情况:在与 openId 提供商成功进行身份验证后,我发现我的数据库中没有与用户 openId 标识符相关联的帐户。

你能告诉我应该如何处理这种情况吗?现在,我正在显示注册表并要求用户创建一个帐户。但是,我对用户身份验证状态有疑问,他现在被视为已通过 spring SecurityContext 类进行身份验证。

如何在重定向到“注册新用户页面”之前在我的 Controller 操作中取消用户身份验证?这种方法是好的方法还是我应该以其他方式进行?

最佳答案

好吧,Samuel 的帖子中提到的将身份验证与授权分开真的很有帮助。然而,仍然有很多陷阱,我发现取消身份验证仍然是必须的,因为在 spring 中没有简单的方法来为用户添加新角色。所以最简单的方法就是强制用户重新登录,让spring处理登录时的角色分配。

为了在 spring security 中取消用户身份验证,你必须调用:

SecurityContextHolder.clearContext();

作为替代方案,您可以在 UserDetailsS​​ervice 实现中抛出异常(见下文)。它的缺点是您会取消用户身份验证并丢失用户上下文数据,因此在创建新本地帐户的过程中无法将新用户帐户与 openid 帐户相匹配。并且您必须在用户使用传统用户名和密码登录后匹配这些帐户。我的解决方案是在创建新帐户后立即取消对用户的身份验证。

为了授予用户角色(特权),您必须重写 UserDetailsS​​ervice,以防有人发现这很有用,这是我的实现:

public final class MyUserDetailsService implements UserDetailsService {
    private final UsersDao usersDao;

    @Autowired
    public UserDetailsServiceImpl(final UsersDao usersDao) {
        this.usersDao = usersDao;
    }

    @Override
    public UserDetails loadUserByUsername(final String username) {      
            UserEntity user = usersDao.getUserByOpenIdIdentifier(username);
            if (user == null) {
                    // there is no such user in our db, we could here throw
                    // an Exception instead then the user would also be deuthenticated 
                    return new User(username, "", new ArrayList<GrantedAuthority>());
            }

            //here we are granting to users roles based on values from db
            final Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority(user.getUserType().toString()));

            final UserDetails result = new User(username, "", authorities);

            return result;
    }
}

关于java - Spring Security openId 支持和用户解除认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727597/

相关文章:

java - 按日期对对象进行分组以放入图表中 JavaFX

java - 将实体传递到 JSP 页面,以及如何从中制作表单?

java - 如何将 jaxb 打印到 java 对象到记录器中

spring-mvc - Spring Boot OAuth2 - 使用本地用户数据库向 Facebook 进行身份验证

spring-mvc - 如何使用带有注释@PreAuthorize ("hasRole(' ADMIN')") 的安全方法在 Controller 上进行 spring 云契约(Contract)测试?

java - 如何使用方法引用/java 8 概括效用函数

java - Spring RedisMap初始化时返回null

java - Maven,在 war 即将构建之前运行java方法或脚本

rest - MvC 中 spring security 中每个路径/路由的不同 AuthenticationManager

java - 通过 AJAX 发布 JSON 重音问题