如何与Spring Security的主体对象一样获取Oauth2的主体对象

时间:2019-03-10 07:57:49

标签: spring-boot spring-security oauth-2.0 spring-security-oauth2

有一个应用程序,其中 Spring Security 配置用于用户身份验证。我需要在应用程序中获得身份验证用户的任何位置,SecurityUtility.getAuthenticatedUser()都会给我; SecurityUtility类是这样的:

public class SecurityUtility {

    public static Integer getAuthenticatedUserId() {
        try {
            User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            Integer PersonelId = null;
            if (user.getPersonel() != null)
                PersonelId = user.getId();
            else
                PersonelId = 1;

            return PersonelId;
        } catch (Exception ex) {
            return 1;
        }
    }

    public static User getAuthenticatedUser() {
        try { 
            return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        } catch (Exception ex) {
            return new User(1);
        }
    }

}

有必要提及的是,SecurityUtility类在应用程序中的使用次数超过500次。
由于 SSO(单点登录)之类的原因,该应用程序必须同时运行在使用 Spring Security 配置的单一模式下,就像正常运行一样并作为 SSO(单点登录)的一部分。由于 SSO ,我必须在 Spring Security 旁边配置 OAuth2 。根据生产模式(单个或sso),该应用程序以其自己的安全层(Spring Security或OAuth2)运行。


我的问题

当应用程序在Spring Security的单模式下运行时,可以,并且没有问题,但是在SSO模式下运行时,SecurityUtility.getAuthenticatedUser() 不会以User对象的形式返回结果,返回username作为字符串
那么,如何解决我可以在OAuth2模式下获得与Spring Security模式下相同的身份验证用户的问题?
是否有可能或者我必须更改SecurityUtility类。

有必要提及的是,在使用Spring Security运行应用程序时,SecurityContextHolder.getContext().getAuthentication()方法中SecurityUtility的类型为org.springframework.serurity.authentication.UsernamePasswordAuthenticationToken,而当应用程序使用Spring Security运行时,其类型为org.springframework.serurity.oauth2.provider.OAuth2Authentication。应用程序使用OAuth2运行

0 个答案:

没有答案