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
도 같은 상황 PassThruAuthenticationFilter
(로그 인 된 form 폼 에 대응 하 는 계 정 input 의 name 값) usernameParam
(암호 input 에 대응 하 는 name 값) 도 설정 되 어 있다.하지만 이런 방식 은 내 문제 가 아니다.@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 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.