ฉันพยายามที่จะบูรณาการในฤดูใบไม้ผลิการรักษาความปลอดภัย SAML ขยายกับฤดูใบไม้ผลิ Boot
เกี่ยวกับเรื่องนี้ฉันได้พัฒนาแอปพลิเคชันตัวอย่างที่สมบูรณ์ ซอร์สโค้ดมันมีอยู่ใน GitHub:
ด้วยการเรียกใช้เป็นแอพพลิเคชั่น Spring Boot (ทำงานกับแอพพลิเคชั่นเซิร์ฟเวอร์ในตัว SDK) WebApp ทำงานได้ดี
แต่น่าเสียดายที่กระบวนการ AuthN เดียวกันไม่ได้ทำงานที่ทั้งหมดในสายน้ำ / WildFly
ตามบันทึกแล้ว IdP จะดำเนินการกระบวนการAuthNจริง: คำแนะนำในUserDetails
การปรับใช้แบบกำหนดเองของฉันนั้นดำเนินการอย่างถูกต้อง แม้จะมีโฟลว์การเรียกใช้งานสปริงไม่ได้ตั้งค่าและคงสิทธิพิเศษสำหรับผู้ใช้ปัจจุบันไว้
@Component
public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService {
// Logger
private static final Logger LOG = LoggerFactory.getLogger(SAMLUserDetailsServiceImpl.class);
@Override
public Object loadUserBySAML(SAMLCredential credential)
throws UsernameNotFoundException, SSOUserAccountNotExistsException {
String userID = credential.getNameID().getValue();
if (userID.compareTo("jdoe@samplemail.com") != 0) { // We're simulating the data access.
LOG.warn("SSO User Account not found into the system");
throw new SSOUserAccountNotExistsException("SSO User Account not found into the system", userID);
}
LOG.info(userID + " is logged in");
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
authorities.add(authority);
ExtUser userDetails = new ExtUser(userID, "password", true, true, true,
true, authorities, "John", "Doe");
return userDetails;
}
}
ในขณะที่การดีบักฉันพบว่าปัญหานั้นขึ้นอยู่กับFilterChainProxy
คลาส ที่รันไทม์แอตทริบิวต์FILTER_APPLIED
ของServletRequest
มีnullSecurityContextHolder
ค่าจึงล้างฤดูใบไม้ผลิ
private final static String FILTER_APPLIED = FilterChainProxy.class.getName().concat(".APPLIED");
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
if (clearContext) {
try {
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
doFilterInternal(request, response, chain);
} finally {
SecurityContextHolder.clearContext();
request.removeAttribute(FILTER_APPLIED);
}
} else {
doFilterInternal(request, response, chain);
}
}
บนVMware vFabric tc SeverและTomcatทุกอย่างทำงานได้อย่างสมบูรณ์ คุณมีความคิดเกี่ยวกับการแก้ไขปัญหานี้หรือไม่?
SecurityContextHolder.clearContext()
ไม่ล้างข้อมูลเซสชัน มันลบที่ThreadLocal
เก็บของบริบทก่อนที่จะปล่อยกระทู้กลับไปที่สระว่ายน้ำด้าย ประเด็นของฉันคือสิ่งนี้ควรเกิดขึ้นเมื่อมีการร้องขอดังนั้นสิ่งที่คุณเห็นเป็นเรื่องปกติและไม่น่าจะเป็นสาเหตุของปัญหาของคุณ
SecurityContextHolder
ควรล้างหลังจากการร้องขอ จุดประสงค์เดียวของรหัสนั้นคือในกรณีที่มีการใช้เชนตัวกรองมากกว่าหนึ่งครั้งในระหว่างคำขอเดียวกัน (ในกรณีนี้เฉพาะเชนดั้งเดิมเท่านั้นที่ควรล้างบริบท) ดังนั้นฉันไม่คิดว่าเป็นปัญหา