7. Spring Security 4 JDBC 를 이용한 로그인 인증방법
인터넷에 너무 복잡하게 하시는 것 같아 간단하게 쓰실 분들에게 좋을 것 같습니다.
시나리오
SpringSecurity4 를 이용하여 JDBC 로그인을 손쉽게 구현을 해봅니다.
JPA, BCrypt 를 사용하였습니다.
Spring Security Config 가 제일 중요합니다.
Member Model
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String mid;
private String mpw;
@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name="mem_no")
private List<MemberRole> roles;
Member 모델에는 다음과 같이 mid(유저 아이디) , mpw(유저 패스워드), Role(권한) => 저는 권한을 여러개 주고 싶어서 이렇게 한것이기 때문에 상황에 맞게 바꾸시면 됩니다
Member Role
public class MemberRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long fno;
private String roleName;
}
Member Role은 Member의 권한을 나타냅니다.
SpringBoot role 조건
DB에 저장하실 때는 ROLE_ADMIN, ROLE_MEMBER 와 같이 저장하셔야 합니다.
SecurityConfig 하단에서 더 설명합니다.
Login View
<form method="post" action="/login">
<input type="text" id="username" name="username">
<input type="password" id="password" name="password">
<input type="submit">
</form>
로그인 뷰는 다음과 같이 합니다.
Controller
@RequestMapping("/login")
public void login() {
}
// 로그인 실패처리
@GetMapping("/login?error")
public String fail() throws IOException{
return "redirect:/?error";
}
본인의 경우 다음과 같이 Controller를 구성하였습니다.
Spring Security Config **
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().formLogin().loginPage("/")
.loginProcessingUrl("/login").permitAll()
.failureUrl("/?error") // default
.usernameParameter("username")
.passwordParameter("password")
.permitAll()
.defaultSuccessUrl("/admin/home")
}
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
final String usernameQuery = "select mid as username,mpw as password,enabled from {Member테이블 이름} where mid=?";
final String authQuery = "select a.mid as username,b.role_name as authority from {Member테이블 이름} as a , {MemberRole 테이블 이름} as b where a.id=b.mem_no and a.mid=?";
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(usernameQuery)
.authoritiesByUsernameQuery(authQuery)
.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
URL에 대한 권한을 설정할 때 hasRole("{권한}") 함수를 사용하게 되는데 이때, {권한}에는 ADMIN,MEMBER 등등이 사용됩니다.
하지만 DB에 저장하실때는 'ROLE_' 을 꼭 붙여야 됩니다.!!
다음 코드를 확인하셔서 진행하시는 프로젝트를 성공하시기 바랍니다. 감사합니다.
Last updated
Was this helpful?