2

我正在寻找正确的方法来使用 Spring Security 在我的应用程序中存储和显示登录用户的其他详细信息。

例如,我想在每一页的顶部显示Welcome:Mr.Smith (Administrator, Math Dept) 。为此,我想获取登录用户的前缀、姓氏、名称和部门。

我正在使用自定义UserDetails服务从数据库中获取用户。浏览时发现AuthenticationhasgetDetails()可以存储与身份验证相关的其他详细信息,我可以使用该方法存储其他详细信息吗?

如果是,你能举一个简单的例子吗?我可以AuthenticationSuccessHanlder用来做这项工作,还是我以完全错误的方式看待问题?我不应该在 spring 安全层中处理这个吗?我应该在哪里照顾它?

4

2 回答 2

5

除了需要您已经确定的自定义身份验证提供程序(的实现UserDetailsService)之外,还可以通过自定义框架进一步提供的默认值来完成。

该框架提供了一个UserDetails接口和它的一些实现,如User类和其他。

例子

在我的一个应用程序中,我需要一个人,但不一定是该应用程序的用户。

我的方法是扩展已经提供的Spring Security User并让我的UserDetailsService实现返回它。

public class RequestUserDetails 
        extends org.springframework.security.core.userdetails.User {
    private static final long serialVersionUID = -6411988532329234916L;
    private Integer personId;

    public RequestUserDetails(String username, String password, Integer personId,
            Collection<? extends GrantedAuthority> authorities) {
        super(username, password, authorities);
        this.personId = personId;
    }

    public Integer getPersonId() {
        return personId;
    }
}

+

@Service
public class UserSecurityService
    implements org.springframework.security.core.userdetails.UserDetailsService {
    [...]
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        [...]
        return new RequestUserDetails(
                userCreds.getLogin(), 
                userCreds.getPassword(),
                person.getId(),
                getAuthorities(domainUser.getRoles())
        );
    }
}

简单的用法

  • 在带有javax.security.Principal参数的控制器级别(不绑定到 Spring MVC):

    ( (RequestUserDetails) ((Authentication)principal).getPrincipal() ).getPersonId()
    
  • 在与 Spring MVC@Controller注释相关的控制器级别,带有一个Authentication参数:

    ( (RequestUserDetails)authentication.getPrincipal() ).getPersonId()
    

如果您需要有关 Spring Security 的进一步参考,UserDetails请转到API javadocs

于 2014-07-10T12:54:38.570 回答
3

额外的详细信息应该是您的自定义 UserDetailsS​​ervice 从其 loadUserByName 方法返回的自定义 UserDetails 类的属性。

于 2012-11-25T23:03:53.367 回答