เนื่องจากบางครั้ง เราต้องการที่จะทำการ 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); } }
แบบนี้แสดงว่าเราต้องไป config ใน xml เพื่อปิด authenticate ปรกติก่อนถูกไหมครับ
ตอบลบไม่ครับ ตัวเก่าก็ยังเหมือนเดิมครับ
ตอบลบตัวนี้แค่เพิ่มขึ้นมาเฉยๆ ผมใช้ตอน register user แล้วต้องการ login ทันทีครับ
user จะได้ไม่ต้องไป login อีกรอบครับ
ขอบคุณครับ
ตอบลบ