曾经有一个由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次,这是非常繁琐的。
解决方案是,我必须重写与上面的代码相同或其他我不知道的事情?
是的,确实,这两种认证在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();
}