Spring Boot + Shiro 사용자 정의 FormAuthenticationFilter, 로그 인 에 성공 하지 못 하고 로그 인 페이지 에 머 무 르 는 문제 가 발생 했 습 니 다.

14826 단어 springbootshiro
Spring Boot + Shiro 사용자 정의 FormAuthenticationFilter, 로그 인 에 성공 하지 못 하고 로그 인 페이지 에 머 무 르 는 문제 가 발생 했 습 니 다.
Spring Boot + Shiro, 사용자 정의 FormAuthenticationFilter 로그 인 성공 시 정상적으로 이동 하지 못 하고 로그 인 페이지 에 머 무 르 는 문제
사용자 정의 FormAuthenticationFilter
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class ShiroAuthcFilter extends FormAuthenticationFilter {

    private static final Logger log = LoggerFactory.getLogger(ShiroAuthcFilter.class);

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        if (this.isLoginRequest(request, response)) {
            return true;
        } else {
            this.saveRequestAndRedirectToLogin(request, response);
            return false;
        }
    }

    @Override
    public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        super.doFilterInternal(request, response, chain);
    }
}

문제 설명
shiro 설정 에 서 는 authc 사용자 정의 filter 를 사용 하여 처 리 했 으 나 로그 인 페이지 에 올 바른 계 정 비밀 번 호 를 입력 한 후 로그 인 을 누 르 면 로그 인 페이지 (로그 인 페이지 새로 고침) 에 머 물 러 시스템 홈 페이지 에 제대로 들 어 갈 수 없 었 습 니 다.
  • 계승 FormAuthenticationFilter 방법 을 재 작성 하고 onAccessDenied 에 관련 설정 을 추가 합 니 다.다음 과 같다.
  • ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
    filterFactoryBean.setSecurityManager(securityManager);
    /**
    *      
    * Map filterMap = new HashMap<>();
    * filterMap.put("authc", authcFilter());
    * filterFactoryBean.setFilters(filterMap);
    *        filterFactoryBean   filters               
    */
    Map<String, Filter> filterMap = filterFactoryBean.getFilters();
    filterMap.put("authc", authcFilter());
    
    /**
     *    authc filter
     * @return filter  
     */
    @Bean
    public Filter authcFilter() {
        ShiroAuthcFilter authcFilter = new ShiroAuthcFilter();
        authcFilter.setUsernameParam("account");
        authcFilter.setPasswordParam(ShiroAuthcFilter.DEFAULT_PASSWORD_PARAM);
        return authcFilter;
    }
    
  • 후속 수정 상속 ShiroConfig 도 같은 상황
  • 조사 와 해결
  • 인터넷 에서 관련 자 료 를 찾 아 보면 유사 한 설정 을 볼 수 있 고 xml 파일 방식 을 통 해 Spring Bean 방식 으로 설정 되 어 있 으 며 filter 에 있 는 PassThruAuthenticationFilter (로그 인 된 form 폼 에 대응 하 는 계 정 input 의 name 값) usernameParam (암호 input 에 대응 하 는 name 값) 도 설정 되 어 있다.하지만 이런 방식 은 내 문제 가 아니다.
  • 오래된 시스템 코드 를 찾 아 보 니 직접 설정 대상 이 있 고 Spring Bean 으로 만 들 지 않 아 도 됩 니 다. 다음 과 같이 수정 합 니 다.
  • @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        filterFactoryBean.setSecurityManager(securityManager);
    
        Map<String, Filter> filterMap = filterFactoryBean.getFilters();
        //       ,   Spring Bean    
        filterMap.put("authc", new ShiroAuthcFilter());
    
      
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/static/**", "anon");
        filterChainDefinitionMap.put("/signIn", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/**", "authc");
        filterFactoryBean.setLoginUrl("/login");
        filterFactoryBean.setSuccessUrl("/");
        filterFactoryBean.setUnauthorizedUrl("/403");
        filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return filterFactoryBean;
    }
    

    로그 인 을 다시 시작 하면 시스템 홈 페이지 에 정상적으로 들 어 갈 수 있 습 니 다.
    비고
    조사 결과 Spring Boot 에 Shiro 를 통합 하여 하나의 가방 passwordParam 을 사용 할 수 있 음 을 발견 하 였 으 며, 추 후 해당 가방 의 로드 와 설정 을 연구 할 수 있 습 니 다.shiro github 소스 코드 를 자세히 볼 수 있 습 니 다. 슈퍼 port 에 있 는 Spring Boot 입 니 다.

    좋은 웹페이지 즐겨찾기