java - Spring 安全定制

标签 java spring spring-mvc spring-security

我希望能够稍微更改 spring 安全性,以便可以通过 Principal 对象访问名称、电子邮件。

还要登录,我想使用电子邮件而不是用户名。

我从哪里开始,或者这是否已经可行?

最佳答案

也不是不可能。不过,您需要提供自己的 UserDetails 实现。一点也不难。 This article显示了一种可能的方法来做到这一点。下面是我最近使用的一些代码:

我首先提供适合我目的的我自己的 UserDetails 实现。实际上,我在 Staff 类中拥有所有额外的详细信息,并且只拥有从 MyUser 到 Staff 的多对一引用。但是,我针对此答案对其进行了简化,只是将 fullName 和 email 属性直接包含在 MyUser 类中。

public class MyUser implements UserDetails {

  @NotNull
  @Size(min = 3, max = 50)
  private String username;

  @NotNull
  @Size(min = 3, max = 256)
  private String password;

  private Boolean enabled;

  private Boolean accountNonLocked;

  private Boolean accountNonExpired;

  private Boolean credentialsNonExpired;

  private String email;

  private String fullName;

  private GrantedAuthority authorities;


  @Override      
  public Collection<GrantedAuthority> getAuthorities() {
    return authorities;
  }

  @Override
  public String toString() {
    return username;
  }

  @Override
public boolean isAccountNonExpired() {
      return this.accountNonExpired;
  }

  @Override
public boolean isCredentialsNonExpired() {
      return this.credentialsNonExpired;
  }

  @Override
public boolean isAccountNonLocked() {
      return this.accountNonLocked;
    }

  @Override
public boolean isEnabled() {
      return this.enabled;
    }

    public String getEmail(){
        return email;
    }

    public String getFullName(){
        return fullName;
    }
}

然后我提供了我自己的用户详细信息服务实现,因为我使用 Hibernate 将所有内容保存在数据库中。您可能需要不同的实现:

public class MyUserDetailsService implements UserDetailsService {

  @Override
  public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException, DataAccessException {
      UserDetails userDetails = null;

    TypedQuery<MyUser> q = MyUser
            .findMyUsersByUsernameEquals(username);
    userDetails = q.getSingleResult();
    if (userDetails == null)
       throw new UsernameNotFoundException("user not found");
    return userDetails;
  } 

}

然后在 applicationContext-security.xml 文件中我添加了这个:

    <!-- Add a custom UserDetailsService -->
<beans:bean id="udservice" class="my.package.name.security.MyUserDetailsService"></beans:bean>

还有这个:

<!-- Configure Authentication mechanism -->
<authentication-manager alias="authenticationManager">      
    <authentication-provider user-service-ref="udservice">
        <password-encoder hash="sha-256" />     
    </authentication-provider>
</authentication-manager>

现在,当您访问登录的用户时,您将获得您的类的实例并访问其所有属性。

关于java - Spring 安全定制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12254166/

相关文章:

java - Java的canwrite()适用于哪些类型的文件?

java - 注入(inject)非 bean 属性的最佳实践

java - Java 中奇怪的日期解析错误

java - Selenium RC 内存泄漏

java - Spring Boot 中的服务节流能力

java - Spring 无法使用 @ComponentScan 中带有星号的 REGEX 类型过滤器来包含/排除 Bean

java - SpringMVC : Can I specify a @ModelAttribute be populated only for specific controller methods?

java - Spring MVC 无 XML 配置异常 : A ServletContext is required to configure default servlet handling

java - 更改 Spring 应用程序启动消息

java - Android中如何用canvas绘制不同的点