【问题标题】:spring security customisation春季安全定制
【发布时间】:2012-09-04 05:52:07
【问题描述】:

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

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

我从哪里开始,或者这已经可能了吗?

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    并非不可能。不过,您需要提供自己的 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>
    

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

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2014-02-02
      • 2012-12-13
      • 2017-11-30
      • 2021-05-12
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多