Spring Security和OAuth2之间Principal接口的两个不同实现

问题描述 投票:1回答:1

曾经有一个由Spring Security配置的单片java应用程序。每当我想获得经过身份验证的用户时,org.springframework.serurity.authentication.UsernamePasswordAuthenticationToken对象就像这样:

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

这段代码一直正常工作,直到我将配置从Spring Security更改为Oauth2。 为了OAuth2,org.springframework.serurity.oauth2.provider.OAuth2Authentication对象为我提供了这样的经过身份验证的用户:

OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication();
LinkedHashMap linkedHashMap = (LinkedHashMap) oAuth2Authentication.getUserAuthentication().getDetails();
return linkedHashMap.get("principal");

所以SecurityContextHolder.getContext().getAuthentication().getPrincipal()的结果是OAuth2和Spring Security之间的区别。 问题是什么: 我的问题是 1-我必须重写每个包含SecurityContextHolder.getContext().getAuthentication().getPrincipal()的地方 同

           Object obj = SecurityContextHolder.getContext().getAuthentication();
            if (obj instanceof OAuth2Authentication) {
                OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication();
                LinkedHashMap linkedHashMap = (LinkedHashMap) oAuth2Authentication.getUserAuthentication().getDetails();
                linkedHashMap.get("principal");
                LinkedHashMap  result = linkedHashMap.get("principal");
                User user = new User();
                user.setId((Integer)result.get("id"));
                user.setName((String)result.get("name"));
                //As same way to set other its attributes@@@@@@@@@@
                return user;
            } else
                return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

2-正如在上面的代码中看到的那样,标记为@@@@@@@@@,用户对象的字段数接近20,所以我必须重复user.setField(result.get("filed")) 20次,这是非常繁琐的。 解决方案是,我必须重写与上面的代码相同或其他我不知道的事情?

java spring-boot spring-security oauth-2.0 spring-security-oauth2
1个回答
2
投票

是的,确实,这两种认证在Spring Security和Spring Oauth2之间是不同的。您可以创建某种@Service或@Component类来处理返回您要查找的内容。然后可以在需要的地方注入/自动装配。基本上,这个新类成为检索主体的唯一真实来源。如果您碰巧再次更改安全实现,则不应影响您的代码,因为安全处理服务会被新接口抽象掉。

见下面的示例:

@Service
public class Oauth2PrincipalService implements PrincipalService {

  public User retreivePrincipalUser(){
    //retreive user stuff here as you need using the oauth2 code you provided..

  }

}
public interface PrincipalService {

  User retreivePrincipalUser();

}

© www.soinside.com 2019 - 2024. All rights reserved.