51. 스프링시큐리티 로그인 페이지 커스터마이징
by 볼빵빵오춘기UserController
- 주소변경을 한다.
- 인증이 안된 사용자들이 출입할 수 있는 경로를 설정 ⇒ /auth/** 허용
- 그냥 주소가 / 이면 index.jsp 도 허용
- static 이하에 있는 resuouce 파일 js, css, image 폴더도 허용
- joinForm() - /auth 붙인다.
- loginForm() - /auth
UserApiController
- 주소변경을 한다.
- save() - “/api/user” → “/auth/joinProc” 로 변경한다.
UserService
로그인() 주석처리한다.
// @Transactional(readOnly = true) // Select 할 때 트랜잭션 시장, 서비스 종료시에 트랜잭션 종료(정합성)
// public User 로그인(User user) {
// return userRepository.findByUsernameAndPassword(user.getUsername(), user.getPassword());
// }
UserRepository
findByUsernameAndPassword() 주석처리한다.
// JPA Naming 전략
// Select * from user Where username = ? and password = ?;
// User findByUsernameAndPassword(String username,String password);
loginForm.jsp
- form태그 밖에 있던 submit버튼 form태그 안으로 위치 변경한다.
- form 태그에 속성 action 넣어준다.
- input 태그에 name 넣어준다.
<form action="/auth/loginProc" method="post">
<div class="form-group">
<label for="username">username:</label>
<input type="text" class="form-control" id="username" placeholder="Enter username" name="username">
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" class="form-control" id="password" placeholder="Enter password" name="password">
</div>
<button id="btn-login" class="btn btn-primary">로그인</button>
</form>
header.jsp
a 링크 href에 /auth 붙여준다.
<c:when test="${empty principal}">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/auth/loginForm">로그인</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/auth/joinForm">회원가입</a>
</li>
</ul>
</c:when>
User.js
- #btn-login 클릭 이벤트 주석처리한다.
- 회원가입 url 변경한다.
$("#btn-login").on("click",()=>{ // function(){} 대신 ()=> 사용한 이유는 this를 바인딩하기 위해서
this.login();
});
save: function(){
// alert('user의 save호출됨');
let data = {
username: $("#username").val(),
password: $("#password").val(),
email: $("#email").val()
}
// console.log(data);
$.ajax({
type: "POST",
// url: "/api/user",
url: "/auth/joinProc",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).done(function(resp){
if(resp.status==5){
alert("회원가입에 실패하였습니다.");
}else{
alert("회원가입이 완료 되었습니다.")
}
location.href="/";
}).fail(function(error){
alert(JSON.stringify(error));
});
},// save end
SecurityConfig
config 패키지 생성, SecurityConfig 클래스 생성 후 아래 코드 추가한다.
// 빈등록: 스프링 컨테이너에서 객체를 관리할 수 있게 하는 것
@Configuration // IoC
public class SecurityConfig {
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Autowired
private PrincipalDetailService principalDetailService;
@Bean
BCryptPasswordEncoder encodePWD() {
return new BCryptPasswordEncoder();
}
// 시큐리티가 대신 로그인해주는데 pw를 가로채기를 하는데
// 해당 pw가 뭘로 해쉬가 되어 회원가입이 되었는지 알아야
// 같은 해쉬로 암호화해서 DB에 있는 해쉬랑 비교할 수 있음
// @Bean
// protected void configure(AuthenticationManagerBuilder auth) throws Exception{
// auth.userDetailsService(principalDetailService).passwordEncoder(encodePWD());
// }
@Bean
SecurityFilterChain configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/","/auth/**","/js/**","/image/**","/css/**","/dummy/**") // 누구나 밑에 코드는 들어갈 수 있는 페이지 설정
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/auth/loginForm")
.loginProcessingUrl("/auth/loginProc") // 스프링 시큐리티가 해당 주소로 요청오는 로그인을 가로채서 대신 로그인 해준다.
.defaultSuccessUrl("/");
return http.build();
}
}
application.properties
spring.jpa.hibernate.ddl-auto를 다시 한 번 create 로 바꾸고 run 한 후 update로 바꿔준다.
why?? 비밀번호를 해쉬 암호화해서 넣을 예정이기 때문이다.
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.ddl-auto=update
'강의 따라하기 > blog' 카테고리의 다른 글
53. XSS와 CSRF (1) | 2024.01.04 |
---|---|
52. 비밀번호 해쉬 후 회원가입하기 (0) | 2024.01.03 |
50. 스프링 시큐리티 체험해보기 (0) | 2024.01.03 |
49. 시큐리티 시작전 요청 주소 변경 (0) | 2024.01.03 |
48. 전통적인 방식의 로그인 방법 (0) | 2024.01.03 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기