Spring Security 3 소스 코드 분석 - Security ContextHolderAware RequestFilter 분석

3136 단어 springsecurity
더 읽 기
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 를 사용 할 때 사실은 이 필 터 를 통 해 이 루어 집 니 다.

좋은 웹페이지 즐겨찾기