2016-09-22 7 views
1

私は春のセキュリティが新しく、いくつかのチュートリアルに従ってきましたが、私はロールの構造が実際にどのように機能しているか理解できません。春のセキュリティ設定ロールオン登録

 @Entity 
     @Table(name = "UserProfile", schema = "dbo", catalog = "DevTestTeam") 
     public class UserProfileEntity implements UserDetails{ 

      @Id 
      @GeneratedValue(strategy = GenerationType.IDENTITY) 
      @Column(name = "id", nullable = false) 
      private long id; 

      @Column(name = "enabled", nullable = false) 
      private boolean enabled; 

      @NotEmpty(message = "Enter a password.") 
      @Size(min = 6, max = 15, message = "Password must be between 6 and 15 characters.") 
      @Column(name = "password", nullable = true, length = 100) 
      private String password; 

      @NotEmpty(message = "Enter a username.") 
      @Size(min = 6, max = 20, message = "Username must be between 6 and 20 characters.") 
      @Column(name = "username", nullable = true, length = 20, unique = true) 
      private String username; 

      @OneToOne 
      @JoinColumn(name = "role_id") 
      private RoleEntity role; 

      public RoleEntity getRole() { 
       return role; 
      } 

      public void setRole(RoleEntity role) { 
       this.role = role; 
      } 

      @Override 
      public Collection<? extends GrantedAuthority> getAuthorities() { 
       List<GrantedAuthority> authorities = new ArrayList<>(); 
       authorities.add(new SimpleGrantedAuthority("ROLE_USER")); 
       return authorities; 
      } 

と役割の1:新規ユーザーを作成するときに

@Entity 
@Table(name = "Role", schema = "dbo", catalog = "DevTestTeam") 
public class RoleEntity { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id", nullable = false) 
private long id; 

@Column(name = "name", nullable = true, length = 255) 
private String name; 

public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

私の混乱が来る私は2つのテーブル、ユーザのための1つを持っています。 UserProfileEntityオブジェクトに裏付けられた登録フォームがあり、ユーザー名とパスワードが入力されます。それから明らかにsetEnabled()= true(分かりやすくするために、このコードからゲッター/セッターのいくつかを残しました)が簡単です。

私の質問は、データベースに保存するUserProfileEntityをインスタンス化するときの役割を設定する方法です。私のrole_idの外部キーは、整数を取ってRoleテーブルからロールを返すだけですが、インスタンス化するときにこれを表現する方法がわかりません。ロールテーブルにidが1のROLE_USERがあり、インスタンス化するのが簡単だと思うが、私が探している答えが見つからない。その後

RoleEntity roleEntity = roleEntityRepository.findByName("ROLE_USER"); 

それを永続化する前にUserProfileEntityからRoleEntityことを設定します:

のUserImpl:

@Service 
public class UserProfileServiceImpl implements UserProfileService{ 
@Autowired 
private UserProfileDao userDao; 

@Override 
public UserProfileEntity findByUser(String username) { 
    return userDao.findByUsername(username); 
} 

@Override 
public List<UserProfileEntity> findAll() { 
    List<UserProfileEntity> list = userDao.findAll(); 
    return list; 
} 

@Override 
public UserProfileEntity save(UserProfileEntity persisted) { 
    userDao.save(persisted); 
    return null; 
} 

@Override 
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    UserProfileEntity user = userDao.findByUsername(username); 
    if (user == null) { 
     throw new UsernameNotFoundException("User not found."); 
    } 

    return user; 
} 

}

答えて

1

名前でユーザーロールを取得するために、いくつかのリポジトリ方法が必要になります

UserProfileEntity userProfileEntity = new UserProfileEntity(); 
userProfileEntity.setRoleEntity(roleEntity); 
userService.save(userProfileEntity); 

また、UserProfileEntityを拡張しないでください。 - ユーザーごとに役割

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

    @Autowired 
    private UserRepository userRepository; 

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

     UserProfileEntity userProfileEntity = userRepository.findByUsername(username); 

     if (userProfileEntity == null) { 
      throw new UsernameNotFoundException("Non existing user!"); 
     } 

     return new org.springframework.security.core.userdetails.User(userProfileEntity.getUsername(), 
       userProfileEntity.getPassword(), 
       Arrays.asList(new SimpleGrantedAuthority(userByUsername.getRoleEntity().getName()))); 
    } 

} 

しかし、私はあなたの要件が非常に簡単であることを参照してください。春のセキュリティのために、あなたはUserDetailsService実装が必要になります。したがって、あなたのRoleEntityは単純に事前に定義された役割を持つ列挙することができます

public enum RoleEntity { 
    ROLE_USER 
} 

そしてUserProfileEntityに、あなたはこのようにそれを使用したい:役割を持つユーザーを永続化する

public class UserProfileEntity { 
    @Enumerated(EnumType.STRING) 
    private RoleEntity roleEntity; 
} 

を:

UserProfileEntity userProfileEntity = new UserProfileEntity(); 
userProfileEntity.setRoleEntity(RoleEntity.USER); 
userService.save(userProfileEntity); 
+0

素晴らしい、アドバイスとさまざまなオプションに感謝します。私は今朝このことに取り組み、私が思いつくことができるものを見ていきます。 –

+0

が参考のために私のImplクラスを追加しました。あなたが示唆しているものにかなり似ています。 –

+1

助けてくれてありがとう、私はあなたが提案した最初の方法を使って終わり、私のRoleEntityにDaoを作った。また、あなたの答えを説明してくれてありがとう、春のセキュリティのこの世界はかなり深いですが、私はそれを今より多く理解しています。 –

関連する問題