当前位置: 首页 > 知识库问答 >
问题:

向存储在 Spring 安全上下文中的主体对象添加其他详细信息

朱宇航
2023-03-14

我使用的是Spring3.0和SpringSecurity3。我能够使用SpringSecurity根据数据库对用户进行身份验证。使用:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

我能够检索当前登录用户的用户名。我希望添加其他详细信息,如用户ID和模块对存储在Spring Security上下文中的主体对象的访问,以便以后可以检索。如何向主体对象添加其他详细信息,然后如何稍后在jsp或java类上检索它。如果可能,请提供适当的代码片段。

编辑:我正在使用JDBC访问我的数据库

提前谢谢。

共有3个答案

谷梁承宣
2023-03-14

(我假设您有一个基本的Spring Security配置,并且知道基本组件如何协同工作)

最“正确”的方法是提供您自己的身份验证提供程序实现,该实现返回自定义身份验证实现。然后,您可以在此身份验证实例中填写所需的一切。例如:

public class MyAuthentication extends UsernamePasswordAuthenticationToken implements Authentication {

    public MyAuthentication(Object principal, Object credentials, int moduleCode) {
        super(principal, credentials);
        this.moduleCode = moduleCode;
    }

    public MyAuthentication(Object principal, Object credentials,  Collection<? extends GrantedAuthority> authorities,int moduleCode) {
        super(principal, credentials, authorities);
        this.moduleCode = moduleCode;
    }

    private int moduleCode;

    public getModuleCode() {
        return moduleCode;
    }   
}


public class MyAuthenticationProvider extends DaoAuthenticationProvider {

    private Collection<GrantedAuthority> obtainAuthorities(UserDetails user) {
        // return granted authorities for user, according to your requirements
    }

    private int obtainModuleCode(UserDetails user) {
        // return moduleCode for user, according to your requirements
    }

    @Override
    public Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) {
        // Suppose this user implementation has a moduleCode property
        MyAuthentication result = new MyAuthentication(authentication.getPrincipal(),
                                                       authentication.getCredentials(),
                                                       obtainAuthorities(user),
                                                       obtainModuleCode(user));
        result.setDetails(authentication.getDetails());
        return result;
    }
}

然后,在applicationContext.xml中:

<authentication-manager>
    <authentication-provider ref="myAuthenticationProvider">
</authentication-manager>

<bean id="myAuthenticationProvider" class="MyAuthenticationProvider" scope="singleton">
    ...
</bean>

我想您可以通过提供AuthenticationDetailsAuthenticationDetailsSource

邢星波
2023-03-14

为了向经过身份验证的用户添加更多详细信息。您需要首先创建自己的User对象实现,它应该扩展Spring Security User对象。之后,您可以将要添加的属性添加到经过身份验证的用户。完成此操作后,您需要在UserDetailService(如果您不使用LDAP进行身份验证)中返回用户对象的实现。此链接提供了向经过身份验证的用户添加更多详细信息的详细信息——

http://javahotspot . blogspot . com/2013/12/spring-security-adding-more-information . html

王航
2023-03-14

以下是您需要的:

  1. 扩展Spring用户组织:Spring框架、安全、核心、用户详细信息、用户)类以及您需要的任何属性。
  2. 扩展Spring用户详细信息服务组织.Spring框架工作.安全.core.用户详细信息.用户详细信息服务)并填充上述对象。覆盖 load用户By用户名返回扩展用户类
  3. 设置您的自定义用户详细信息服务身份验证管理器生成器

例如

public class CurrentUser extends User{

   //This constructor is a must
    public CurrentUser(String username, String password, boolean enabled, boolean accountNonExpired,
            boolean credentialsNonExpired, boolean accountNonLocked,
            Collection<? extends GrantedAuthority> authorities) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
    }
    //Setter and getters are required
    private String firstName;
    private String lastName;

}

自定义用户详细信息可以是:

@Service("userDetailsService")
public class CustomUserDetailsService implements UserDetailsService {

@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {

    //Try to find user and its roles, for example here we try to get it from database via a DAO object
   //Do not confuse this foo.bar.User with CurrentUser or spring User, this is a temporary object which holds user info stored in database
    foo.bar.User user = userDao.findByUserName(username);

    //Build user Authority. some how a convert from your custom roles which are in database to spring GrantedAuthority
    List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());

    //The magic is happen in this private method !
    return buildUserForAuthentication(user, authorities);

}


//Fill your extended User object (CurrentUser) here and return it
private User buildUserForAuthentication(foo.bar.User user, 
List<GrantedAuthority> authorities) {
    String username = user.getUsername();
    String password = user.getPassword();
    boolean enabled = true;
    boolean accountNonExpired = true;
    boolean credentialsNonExpired = true;
    boolean accountNonLocked = true;

    return new CurrentUser(username, password, enabled, accountNonExpired, credentialsNonExpired,
            accountNonLocked, authorities);
   //If your database has more information of user for example firstname,... You can fill it here 
  //CurrentUser currentUser = new CurrentUser(....)
  //currentUser.setFirstName( user.getfirstName() );
  //.....
  //return currentUser ;
}

private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {

    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

    // Build user's authorities
    for (UserRole userRole : userRoles) {
        setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
    }

    return new ArrayList<GrantedAuthority>(setAuths);
}

}

配置Spring安全上下文

@Configuration
@EnableWebSecurity
@PropertySource("classpath://configs.properties")
public class SecurityContextConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("userDetailsService")
    private UserDetailsService userDetailsService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

一切都完成了!

您可以调用(CurrentUser)getAuthentication()。getPrincipal()以获取新的CurrentUser

 类似资料:
  • 问题内容: 我正在使用Spring 3.0和Spring Security3。我能够使用Spring Security对数据库进行用户身份验证。使用: 我能够检索当前登录用户的用户名。我希望添加其他详细信息,例如用户ID和模块对存储在Spring Security上下文中的主体对象的访问,以便以后可以检索它。如何将其他详细信息添加到主体对象,然后稍后如何在jsp或java类上检索它。如果可能,请提

  • 问题内容: 我正在使用Spring 3.0和Spring Security3。我能够使用Spring Security对数据库进行身份验证。使用: 我能够检索当前登录用户的用户名。我希望添加其他详细信息,例如用户ID和模块对存储在Spring Security上下文中的主体对象的访问,以便以后可以检索它。如何将其他详细信息添加到主体对象,然后以后如何在jsp或java类上检索它。如果可能,请提供适

  • 我正在使用spring security的spring boot 2.2.4。我面临的问题是,每次我与新用户登录时,主要用户名都会重置为新登录用户的详细信息,为什么。然而,正如我所观察到的,会话ID仍然正确。我不理解这种行为。知道吗? 用户详情服务 UserDetails类

  • 对于我们的应用程序,我们需要能够提供团体访问文件。每个用户可能拥有大量的组,因此使用“自定义令牌”解决方案是没有意义的(无论如何,这是非常尴尬的)。 我发现,Firebase的存储安全规则非常有限。主要问题是,我们将组定义保留在存储安全规则无法访问的Firestore中。 为了克服这个问题,我们决定在每个上传文件的元数据中包含一个“令牌”,组中的任何人都可以访问这个令牌。当他们下载一个文件时,他们

  • 本文向大家介绍如何在SAP-MDG中存储详细信息?,包括了如何在SAP-MDG中存储详细信息?的使用技巧和注意事项,需要的朋友参考一下 如果您不想创建自定义表,则可以借助重用方法来创建数据模型。然后,您可以将此新创建的数据模型保存在暂存MDG中。您还有其他选择是Z表。您可以创建一个Z表来保留数据。 希望这可以帮助!

  • 目前我正在为客户建立一个在线商店(使用OpenCart)。所有的支付和交易都是通过支付网关(PayPal等)进行的,所以网站从不存储支付信息(银行详细信息、卡号等)。 然而,我的客户仍然担心客户个人信息(地址、出生日期、全名等)的安全。我向他解释过,使用SSL,客户端和服务器之间传输的任何数据都是加密的,不加密服务器上的个人信息是正常的(我指出,即使是像索尼这样的大公司也不加密)。 显然,加密My