หน้าเว็บ

วันศุกร์ที่ 5 กันยายน พ.ศ. 2557

Spring Security Manual Login : java

ต่อยอดจากบทความ การทำ Login ด้วย Spring security

        เนื่องจากบางครั้ง  เราต้องการที่จะทำการ login ด้วยตนเอง  โดยไม่ผ่าน service login ของ spring security เช่น  กรณีที่ user ทำการ register ระบบ  แล้วเราต้องการให้ authen ต่อจากการ register นั้นๆ เลย 

มีแต่ code น่ะครับ (สำหรับคนที่คล่อง spring security อยู่แล้ว)
package com.blogspot.na5cent.security;

import com.blogspot.na5cent.util.SpringUtils;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

/**
 * @author redcrow
 */
public class ManualAuthen {

    /**
     * @param username
     * @param password
     * @param request
     */
    public static void login(String username, String password, HttpServletRequest request)  throws UsernameNotFoundException {
        ServletContext servletContext = request.getServletContext();
        SecurityContext securityContext = SecurityContextHolder.getContext();
        AuthenticationManager manager = (AuthenticationManager) SpringUtils.getBean(servletContext, "authenManager");
        UserDetailsService detailsService = SpringUtils.getBean(
                servletContext,
                UserDetailsService.class
        );
        //check authen from user details service
        UserDetails userDetails = detailsService.loadUserByUsername(username);
        Authentication authentication = manager.authenticate(new UsernamePasswordAuthenticationToken(
                userDetails,
                password
        ));
        //keep authentication to security context 
        securityContext.setAuthentication(authentication);
    }
}
code SpringUtils ก็ประมาณนี้ครับ เพียงแต่อันนี้ใช่ร่วมกับ jsf  http://na5cent.blogspot.com/2012/12/jsf-get-service-by-webapplicationcontex.html

หรือจะเขียนอีกแบบ ก็ประมาณนี้ครับ

interface
package com.blogspot.na5cent.security;

import org.springframework.security.core.userdetails.UsernameNotFoundException;

/**
 * @author redcrow
 */
public interface ManualAuthen {

    public void login(String username, String password) throws UsernameNotFoundException ;
}
implementation
package com.blogspot.na5cent.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
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;

/**
 * @author redcrow
 */
@Service
public class DefaultManualAuthenImpl implements ManualAuthen {

    @Autowired
    @Qualifier("authenManager")
    private AuthenticationManager manager;
    @Autowired
    private UserDetailsService detailsService;

    /**
     * @param username
     * @param password
     */
    @Override
    public void login(String username, String password) throws UsernameNotFoundException {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        //check authen from user details service
        UserDetails userDetails = detailsService.loadUserByUsername(username);
        Authentication authentication = manager.authenticate(new UsernamePasswordAuthenticationToken(
                userDetails,
                password
        ));
        //keep authentication to security context 
        securityContext.setAuthentication(authentication);
    }
}

3 ความคิดเห็น:

  1. แบบนี้แสดงว่าเราต้องไป config ใน xml เพื่อปิด authenticate ปรกติก่อนถูกไหมครับ

    ตอบลบ
  2. ไม่ครับ ตัวเก่าก็ยังเหมือนเดิมครับ
    ตัวนี้แค่เพิ่มขึ้นมาเฉยๆ ผมใช้ตอน register user แล้วต้องการ login ทันทีครับ
    user จะได้ไม่ต้องไป login อีกรอบครับ

    ตอบลบ