Spring Security 3 소스 코드 분석 - Security ContextHolderAware RequestFilter 분석
Security ContextHolder Aware RequestFilter 필터 에 대응 하 는 클래스 경 로 는?
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
클래스 이름 에서 이 필 터 는 주로 포장 요청 대상 request 의 것 으로 원본 코드 를 볼 수 있 습 니 다.
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(new SecurityContextHolderAwareRequestWrapper((HttpServletRequest) req, rolePrefix), res);
}
Security ContextHolderAware RequestWrapper 류 가 request 포장 에 대한 목적 은 주로 servlet api 의 일부 인터페이스 방법 인 isUserInRole, getRemoteUser 를 실현 하 는 것 이다.
// SecurityContext Authentication
private Authentication getAuthentication() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!authenticationTrustResolver.isAnonymous(auth)) {
return auth;
}
return null;
}
// getRemoteUser 。 ,
@Override
public String getRemoteUser() {
Authentication auth = getAuthentication();
if ((auth == null) || (auth.getPrincipal() == null)) {
return null;
}
if (auth.getPrincipal() instanceof UserDetails) {
return ((UserDetails) auth.getPrincipal()).getUsername();
}
return auth.getPrincipal().toString();
}
// getUserPrincipal
@Override
public Principal getUserPrincipal() {
Authentication auth = getAuthentication();
if ((auth == null) || (auth.getPrincipal() == null)) {
return null;
}
return auth;
}
// 。 rolePrefix,
private boolean isGranted(String role) {
Authentication auth = getAuthentication();
if( rolePrefix != null ) {
role = rolePrefix + role;
}
if ((auth == null) || (auth.getPrincipal() == null)) {
return false;
}
Collection authorities = auth.getAuthorities();
if (authorities == null) {
return false;
}
for (GrantedAuthority grantedAuthority : authorities) {
if (role.equals(grantedAuthority.getAuthority())) {
return true;
}
}
return false;
}
// isUserInRole
@Override
public boolean isUserInRole(String role) {
return isGranted(role);
}
이 필 터 는 보기에 매우 간단 하 다.목적 은 자바 ee 에서 servlet api 의 일부 인터페이스 방법 을 실현 하 는 것 입 니 다.
일부 응용 프로그램 에 서 는 getRemoteUser 방법, isUser InRole 방법 을 직접 사용 하 는데, spring security 를 사용 할 때 사실은 이 필 터 를 통 해 이 루어 집 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.