login with spring security

This commit is contained in:
kim
2020-12-09 02:39:52 +09:00
parent 0a9029e4aa
commit 4d6981459f
6 changed files with 110 additions and 4 deletions

View File

@@ -21,13 +21,15 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); http.csrf().disable();
http.authorizeRequests() http.authorizeRequests()
.antMatchers("/user/**").authenticated() .antMatchers("/user/**").authenticated() // 인증만 되면 들어갈 수 있다.
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')") .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll() .anyRequest().permitAll()
.and() .and()
.formLogin() .formLogin()
.loginPage("/loginForm"); .loginPage("/loginForm")
.loginProcessingUrl("/login") // /login 주소가 호출이 되면 시큐리티가 대신 로그인을 진행해 준다.
.defaultSuccessUrl("/");
} }
} }

View File

@@ -0,0 +1,71 @@
package com.spring.security1.config.auth;
// 시큐리티가 /login 주소 요청이 오면 대신 로그인을 진행시킨다.
// 로그인이 완료가 되면 시큐리티 session을 만들어 준다. (Security ContextHolder)
// 오브젝트 타입 => Authentication 타입 객체
// Authentication 안에 User 정보가 있어야 한다.
// User오브젝트 타입 => UserDetails 타입 객체
// Security Session => Authentication => UserDetails
import com.spring.security1.model.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
public class PrincipalDetails implements UserDetails {
private User user;
public PrincipalDetails(User user) {
this.user = user;
}
// 해당 User의 권한을 리턴하는 곳
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return user.getRole();
}
});
return collection;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
// ex) 1년동안 회원이 로그인을 안하면 휴면계정으로 하기로 했다면?
// 현재시간 - 로그인 시간 => 1년을 초과하면 false 리턴
return true;
}
}

View File

@@ -0,0 +1,30 @@
package com.spring.security1.config.auth;
import com.spring.security1.model.User;
import com.spring.security1.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
// 시큐리티 설정에서 loginProcessingUrl("/login);
// /login 요청이 들어오면 자동으로 UserDetailsService 타입으로 IoC되어 있는
// loadUserByUsername 함수가 실행 된다.
@Service
@RequiredArgsConstructor
public class PrincipalDetailsService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User userEntity = userRepository.findByUsername(username);
System.out.println(username);
if(userEntity != null) {
return new PrincipalDetails(userEntity); // 시큐리티 session 내부에 Authentication 내부에 UserDetail 이 들어간다.
}
return null;
}
}

View File

@@ -8,4 +8,7 @@ import org.springframework.stereotype.Repository;
// JpaRepository를 상속 했기 때문에 @Repository 어노테이션이 없어도 IoC된다. // JpaRepository를 상속 했기 때문에 @Repository 어노테이션이 없어도 IoC된다.
@Repository @Repository
public interface UserRepository extends JpaRepository<User, Integer> { public interface UserRepository extends JpaRepository<User, Integer> {
// findBy규칙 ->Username 문법
// select * from user where username='?';
User findByUsername(String username);
} }

View File

@@ -16,7 +16,7 @@ spring:
jpa: jpa:
hibernate: hibernate:
ddl-auto: create #create update none ddl-auto: update #create update none
naming: naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true show-sql: true

View File

@@ -7,7 +7,7 @@
<body> <body>
<h1>로그인 페이지</h1> <h1>로그인 페이지</h1>
<hr/> <hr/>
<form> <form action="/login" method="post">
<input type="text" name="username" placeholder="Username"/> <br/> <input type="text" name="username" placeholder="Username"/> <br/>
<input type="password" name="password" placeholder="Password"/> <br/> <input type="password" name="password" placeholder="Password"/> <br/>
<button>로그인</button> <button>로그인</button>