วันศุกร์ที่ 19 มิถุนายน พ.ศ. 2558

Spring Boot ตอนที่ 7 Security

Spring Boot ก็ใช้ Spring Security ครับ ซึ่งก็ทำง่ายมาก แต่หันมาใช้การ Config ผ่าน Annotation และก็เขียนคลาสหมดไม่ได้ใช้ XML แล้วครับ ซึ่งอาจจะดูแปลกตาสำหรับคนที่ใช้ XML พอสมควร งั้นมาเริ่มกันเลย
1. Config POM เพิ่ม
 <dependency>  
         <groupId>org.springframework.boot</groupId>  
         <artifactId>spring-boot-starter-security</artifactId>  
</dependency>  

2. ต่อไปก็ EnableWebSecurity
 package tutorial.spring4;  
 import javax.annotation.Resource;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.context.annotation.Configuration;  
 import org.springframework.security.authentication.encoding.PlaintextPasswordEncoder;  
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;  
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;  
 import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;  
 import org.springframework.security.core.userdetails.UserDetailsService;  
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;  
 import org.springframework.security.crypto.password.NoOpPasswordEncoder; 
 
 @Configuration  
 @EnableWebMvcSecurity  
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {  
      @Resource(name="basicUserDetailService")  
      private UserDetailsService userDetailsService;  
      @Override  
      protected void configure(HttpSecurity http) throws Exception {  
           http.authorizeRequests().antMatchers("/hello").permitAll().anyRequest().authenticated().and()  
                     .formLogin().loginPage("/login").failureUrl("/login?error").defaultSuccessUrl("/loginresult", true).permitAll()  
                     .and().logout().permitAll();  
      }  
      @Override  
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {  
           auth.userDetailsService(userDetailsService).passwordEncoder(new PlaintextPasswordEncoder());  
      }  
 }  
     แบบนี้เป็น Config ให้ใช้ UserDetailService ที่คุ้นเคย โดยเราจะเห็นว่า Class นี้เป็น Config และบอกให้ Enable Web Security ด้วย และ extends WebSecurityConfigurerAdapter มีสองตัวหลักๆ
     - Method แรก สำหรับที่เรา Config Route ที่เคยเห็นๆ บน XML อันนี้ยกมาบน Class สำหรับผ่านง่ายขึ้น อธิบายคร่าวๆ
          - antmatches คือตรงกับอันนี้ จะทำอะไรอ่านข้างหลัง permitAll คือเข้าได้หมด อันอื่นๆ anyRequest ต้องมี Authen พอทำเสร็จ
          - ส่วนของหน้า Login ใช้ formLogin ด้วยหน้าอะไร ถ้า fail ไปไหน สามารถกำหนดได้ว่า ถ้า login ให้กลับไปหน้าเก่าที่เราเข้ามาได้ด้วยนะครับ
     - Method ที่สอง หลักๆ ไว้สำหรับเรื่องว่าจะ authen แบบไหนมี่ทั้ง JDBC/LDAP/ InMemory

3. แค่นี้ก็เป็นอันเสร็จเรียบร้อยแล้วครับ

References
Basic
1. Spring Boot ตอนที่ 1 มาทำความรู้จักกับ Spring Boot
2. Spring Boot ตอนที่ 2 Hello World
3. Spring Boot ตอนที่ 3 โครงสร้างของ Project
4. Spring Boot ตอนที่ 4 Spring Boot กับ Thymeleaf
5.Spring Boot ตอนที่ 5 Spring Boot กับ Database [แบบ Embeded]
6.Spring Boot ตอนที่ 6 กับ Production Database
7.Spring Boot ตอนที่ 7 Security
8.Spring Boot ตอนที่ 8 Testing