Spring Security Dersleri Veritabanı Yetkilendirme User Detail Kullanımı
Spring Security Dersleri’ne devam ediyoruz.
Bu yazıda Veritabanımızdaki kullanıcılar ve bu kullanıcıların yetkilerini Spring Security’e UserDetail ve UserDetailService kullanarak Spring Security’e devrederek nasıl kullanırız buna bakacağız.
User ve Role entitylerini oluştralım ve User ve Role arasında bir ilişki olmasını sağlayacağız. Bu ilişkiyi kullanarak Spring Security’nin UserDetail interface’sini doldurağız ve tüm yetkinin Spring Security’e vermiş olacağız.
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="user_table")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private long id;
private String name;
private String password;
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "user_role",
joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "role_id")}
)
private List<Role> roles;
}
Code language: CSS (css)
User entitymizi oluşturduk ve Role entity’i ile bir ilişki kuruyoruz.
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="role_table")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="role_id")
private Long id;
private String role_name;
}
Code language: PHP (php)
Entitylerimizi oluşturduk. Şimdi ise Spring Security configimizi düzenleyeceğiz. Bu config ile birlikte Spring Security UserDetailService’ı kullanarak veritabanından kullanıcı ve rol bilgilerini çekmemiz gerektiğini söylüyoruz.
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByName(username);
return new CustomUserDetail(user);
}
}
Code language: PHP (php)
Veritabanından kullanıcı bilgilerini aldıktan sonra Spring Security’e vermek için UserDetail interfacesini doldurmamız gerekmekte.
public class CustomUserDetail implements UserDetails {
private String name;
private String password;
private List<GrantedAuthority> roles;
public CustomUserDetail(User user){
this.name=user.getName();
this.password=user.getPassword();
this.roles=user.getRoles().stream().map((role -> new SimpleGrantedAuthority(role.getRole_name()))).collect(Collectors.toList());
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return name;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
Code language: PHP (php)
Spring Security’nin yaşam döngüsü boyunca uygulamamızı güvende tutmak için gereken bilgileri veritabanından alarak gerekli alanlara eşitleyerek vermiş oluyoruz.
No Comment! Be the first one.