หน้าเว็บ

วันพุธที่ 4 มีนาคม พ.ศ. 2558

Spring security bypass authen : java


        บางครั้งเราต้องการให้ระบบ bypass authen (กระโดดข้ามการ authen) ด้วย username password
เราสามารถทำแบบนี้ได้ครับ  spring จะไม่ check username password เรา
เราแค่จับ ข้อมูล user (user details) ยัดเข้าไปใน spring context security เลย

ทำไมต้อง bypass

        เนื่องจากการ authen แบบเดิม  เราต้องรู้ username และ clean password เพื่อ authen เข้าใช้งาน
มันเกิดปัญหาว่า  ระบบที่ผมทำ  ผมไม่ได้เก็บ password ของผู้ใช้เป็น clean text ไว้  ผมเข้ารหัส password ไว้ตั้งแต่แรก (เพื่อความปลอดภัย) เพราะฉะนั้น  ผมจึงใช้วิธี authen แบบเดิมไม่ได้ (authen แบบเดิม  จะเอา password มา encrypt check กับ encrypt  password ที่มีอยู่ ว่า matches กันมั้ย)

        ปัญหาต่อมา  คือ  ผมทำระบบที่สามารถ login ด้วยบัญชีผู้ใช้ facebook  แน่นอนว่ามันไม่มี password  เพราะ facebook ใช้ token  แล้วผมจะ  authen เข้าสู่ระบบที่ผมทำยังไง?

        คิดอยู่สักพัก  ก็เกิดคำถามขึ้นมาในหัว  เราสามารถ bypass มันได้มั้ย ?
ก็เลยเป็นที่มาของบทความวันนี้ครับ

 User.java
...
...
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

public class User implements UserDetails {

    ....
    ....
}
BypassAuthen.java
package com.blogspot.na5cent.security;

import com.blogspot.na5cent.model.User;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Component;

/**
 * @author redcrow
 */
@Component
public class BypassAuthen {

    public void login(User user) {

        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = new UsernamePasswordAuthenticationToken(
                user,
                null,
                user.getAuthorities()
        );

        securityContext.setAuthentication(authentication);
    }

}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น