Spring Security 를 적용하는 내용을 처음부터 차근차근 정리를 해보려고 한다.
목표는 Spring Security 를 공부하면서 각각의 기능들을 적용해보는것이다. 진행하다보면 Spring Security 뿐만 아니라 다른 내용들도 점점 추가될것 같다. 다 만들고 나서는 git에 소스를 공유할 생각이다. ^^;; 언제가 될지는 잘 모르겠다.
환경 : java 1.8, Spring Boot 1.5.3 Release, Maria DB, JPA, gradle
build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | buildscript { ext { springBootVersion = '1.5.3.RELEASE' } repositories { jcenter() mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'org.springframework.boot' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { jcenter() mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-security') testCompile('org.springframework.boot:spring-boot-starter-test') runtime ('org.mariadb.jdbc:mariadb-java-client') } | cs |
아직 초반이어서 라이브러리가 몇개 없다. spring-boot 에서 사용하는 jpa, security, test, web 라이브러리가 끝이다. 그리고 DB를 사용하기 위한 mariadb client까지만 추가되어있다.
도메인.
Account.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Entity public class Account { @Id private String loingId; private String username; private String password; private String email; private boolean enabled; } | cs |
Account 도메인이 있다. 만들기는 더 여러개 만들어놓았는데 우선은 이것만 필요해서 적었다. 위 Account.java 소스에는 getter/setter 메소드는 삭제하고 올렸다. (너무 길어서)
다음은 Account 관련 Service와 Repository 이다.
AccountRepository.java
1 2 | public interface AccountRepository extends JpaRepository<Account, String> { } | cs |
AccountService.java
1 2 3 4 | public interface AccountService { Account get(String loginId); } | cs |
AccountServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 | @Service public class AccountServiceImpl implements AccountService { @Autowired private AccountRepository accountRepository; @Override public Account get(String loginId) { return accountRepository.findOne(loginId); } } | cs |
Repository를 다이렉트로 호출해도 되긴 하지만 아무래도 구조상 service 레이어가 있는게 맞다고 판단해서 repository는 Service 에서 호출하도록 한번 감쌌다. 지금은 간단히 호출만 하지만 나중에는 로직도 들어갈것이 예상된다.
CustomUserDetailService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Service public class CustomUserDetailService implements UserDetailsService{ @Autowired private AccountService accountService; @Override public UserDetails loadUserByUsername(String loginId) throws UsernameNotFoundException { Account account = accountService.get(loginId); List<GrantedAuthority> grantedAuthorities = new ArrayList<>(); User user = new User(account.getLoingId(), account.getPassword(), grantedAuthorities); return user; } } | cs |
UserDetailsService에 있는 loadUserByUsername 메소드를 제정의 해서 UserDetails 객체를 정의해준다. UserDetails는 사용자의 인증정보를 담고있다. 위에서 Account Service에서 loginId로 정보를 조회해서 가져온 id, password, 권한(아직 미구현으로 객체만 생성했다) 정보를 user로 생성해주고 있다.
ResourceSecurityConfiguration.java
1 2 3 4 5 6 7 8 9 10 11 12 | @Configuration @EnableGlobalAuthentication public class ResourceSecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private CustomUserDetailService customUserDetailService; public void init(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(this.customUserDetailService); } } | cs |
WebSecurityConfigurerAdapter에 있는 init 메소드를 사용해서 AuthenticationManangerBuilder에 userDetailService를 내가 새로 만든 CustomUserDetailService를 사용하겠다고 설정해준다.
StudySpringApplication.java
1 2 3 4 5 6 7 8 9 10 | @SpringBootApplication public class StudySpringApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(StudySpringApplication.class); app.run(args); } } | cs |
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | server: port: 9000 spring: datasource: driver-class-name: org.mariadb.jdbc.Driver url: jdbc:mariadb://localhost:3306/holmes username: root validation-query: select 1 test-while-idle: true time-between-eviction-runs-millis: 300000 test-on-borrow: false jpa: database: mysql show-sql: true hibernate: ddl-auto: update properties: hibernate: format_sql: true dialect: org.hibernate.dialect.MySQLDialect default_schema: holmes | cs |
이제 어플리케이션을 실행해보면 로그인 페이지가 나온다.
위에 소스와 약간 차이가 있을수 있지만 아래 Git repository 에 가면 소스를 확인할 수 있다.
https://github.com/blusky10/study_spring
'Development > Java' 카테고리의 다른 글
[Spring Boot]Oauth server 적용해보기 (0) | 2017.09.04 |
---|---|
[OAuth] Oauth의 간략한 흐름. (0) | 2017.07.04 |
[Spring]Controller Test 하기 (0) | 2017.06.12 |
[Spring]Jasypt 를 이용한 properties 암호화 (6) | 2017.04.25 |
[SpringCloud]Spring Config.. (0) | 2016.01.26 |