Spring Boot 에서 Security Form Login 적용 방법이다.
먼저, 간단한 DB, 의존성 세팅과 DB연결 후 Security를 적용한다.
1. 기본 세팅
1.1 DB설정
로그인에 사용할 DB테이블을 먼저 생성한다.
CREATE TABLE `user` (
`id` VARCHAR(50) NOT NULL,
`pw` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
1.2 dependency 설정
DB는 현재 MariaDB와 JPA를 사용하며, spring security 의존성과 함께 추가한다.
implementation 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
1.3 DB 연결 설정
application.yml(properties) 파일에 DB 연결 정보를 추가 한다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: "jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Seoul"
username:
password:
jpa:
hibernate:
ddl-auto: update
generate-ddl: false
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
properties:
hibernate:
format_sql: true
2. JPA 적용
Jpa는 Entity와 Interface로 이루어진 Repository를 생성하면 간단하게 적용할 수 있다.
2.1 Entity 생성
UserVO를 생성하여 생성한 DB테이블에 맞게 VO에 Entity와 Column명 들을 설정한다.
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "user")
public class UserVO {
@Id
@Column(name = "id")
private String id;
@Column(name = "pw")
private String pw;
@Column(name = "name")
private String name;
}
2.2 JpaRepository 생성
VO로 생성한 table을 연결할 JpaRepository를 생성한다.
public interface UserRepository extends JpaRepository<UserVO, String> {
}
3. Security 적용
3.1 WebSecurityConfigurerAdapter 적용
먼저 WebSecurityConfigurerAdapter를 상속받고, 아래 2개의 메소드를 Override하고 Bean을 등록한다.
1. configure(HttpSecurity http) 메소드는 기본적인 security 기본 설정을 하는 것이다. 현재는 csrf를 비활성화 시키고,
authorizeRequests()를 이용하여 요청에대한 권한을 처리한다. /login 경로는 권한이 없어도 접속을 허용하고, anyRequest().authenticated()를 통해 이 외의 경로는 권한이 있어야 접속을 허용한다.
formLogin() 을 통해 formLogin을 사용하겠다는 것이며, formLogin 페이지를 만들지 않았다면, Security에서 제공해주는 로그인페이지를 사용한다. 만약 로그인페이지가 있다면. formLogin().loginPage("로그인페이지 경로") 라는 loginPage 옵션을 추가하여 로그인페이지를 커스텀페이지로 변경할 수 있다.
formLogin에는 로그인 성공시 작동할 기능, 실패시 작동할 기능, 로그인 인증 URL 변경 등 다양한 기능들이 있다.
2. configure(AuthenticationManagerBuilder auth) 메소드는 인증방법을 의미하며,
Spring에서 xml로 Security 설정시 <authentication-manager> <authentication-provider>를 설정하는 것과 같다. 예를 들면 DB에서 사용자 정보를 불러와 현재 입력된 정보와 비교 후 UserDetails 을 반환하여 인증하겠다 라는 의미이다.
현재는 CustomUserDetailSerivce 객체에 인증 방법이 있으며, 패스워드 인코더를 설정해 두었다.
3. PasswordEncoder는 로그인시 DB에 BCrpyt로 저장되어있는 패스워드를 로그인할 때 입력한 비밀번호와 비교하기 위해 사용되며, 이는 인증할 때 사용되는 configure(AuthenticationManagerBuilder auth) 메소드에 사용될 것이다.
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// TODO Auto-generated method stub
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
3.2 인증을 처리할 메소드
아이디와 비밀번호를 통해 인증을 직접적으로 처리할 메소드이다.
UserDetailsService를 implements하여 loadUserByUsername을 Override한다.
권한을 임의로 생성하였으며,
2번에서 생성한 Repository를 통해 userRepository.findById(로그인아이디)를 사용하여, DB에 저장되어있는 아이디와 비밀번호를 불러온다.
불러온후 security.core에서 제공해주는 User객체를 생성하여 반환한다.
configure(AuthenticationManagerBuilder auth)에서 설정한 BCrpyt PasswordEncoder에는 macth라는 패스워드 비교하는 기능이 있는데 User 객체를 반환하면서 현재의 비밀번호와 폼에서 입력한 비밀번호가 match 기능으로 인하여 비밀번호를 비교해주고 비밀번호가 올바르면 로그인 인증 성공으로 처리하고 틀리다면 실패로 처리한다.
import org.springframework.security.core.userdetails.User;
@Service
public class CustomUserDetailService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// TODO Auto-generated method stub
Collection<SimpleGrantedAuthority> roles = new ArrayList<SimpleGrantedAuthority>();
roles.add(new SimpleGrantedAuthority("ROLE_USER"));
UserVO userVO =userRepository.findById(username).orElseThrow(() -> new NoSuchElementException());
return new User(userVO.getId(), userVO.getPw(), roles);
}
}
이러한 방법을 이용하여, 생성한 DB User테이블에 임의의 ID와 BCrpyt로 암호화한 패스워드를 넣고,
서버를 실행하여 /login 경로로 접속하면, Spring Security에서 기본으로 제공하는 Login Form을 이용하여 로그인을 할 수 있다.
'Develop > Spring Boot' 카테고리의 다른 글
Spring Boot Security JWT 인증 (0) | 2021.01.27 |
---|---|
Kotiln Spring Boot Webflux r2dbc(MySQL) (0) | 2020.06.04 |
Maven(Spring, Spring boot) template제작방법 - archetype (0) | 2020.05.26 |
Kotlin Spring Boot Webflux (Eclipse) (0) | 2020.04.26 |
Spring boot .ebextensions nginx 및 기본 사용방법 (AWS Elastic Beanstalk) (8) | 2019.02.12 |