AuthenticationProvider
을 구현하여 응용 프로그램에서 스프링 보안을 사용하여 사용자 지정 인증을 구현하려고합니다. 인증은 성공적이며 사용자도 지정된 역할을 가지고 있지만 여전히 액세스 거부 페이지가 표시됩니다. 아래는 제 코드입니다. 나는 봄 보안이 처음이다. 도와주세요. 미리 감사드립니다스프링 인증 사용자 지정 AuthenticationProvider에서 액세스 거부 오류가 발생했습니다.
봄-security.xml
<form-login
login-page="/login" login-processing-url="/j_spring_security_check" default-target-url="/welcome" authentication-failure-url="/login?error"
/>
<access-denied-handler error-page="/403" />
<logout logout-success-url="/login?logout" />
<csrf disabled="true"/>
</http>
<authentication-manager id="dao-auth" erase-credentials="false">
<authentication-provider ref="customAuthenticationProvider">
</authentication-provider>
</authentication-manager>
<b:bean id="customAuthenticationProvider" class="com.xom.custom.dataservice.impl.CustomAuthenticationProvider"></b:bean>
CustomAuthenticationProvider
@Override
public Authentication authenticate(Authentication authentication) throws
AuthenticationException {
String name = authentication.getName();
String password = authentication.getCredentials().toString();
final User rasUser;
try {
rasUser = checkPrivileges(name, password);
} catch (NoRASUserLoginException exception) {
throw new ServiceException(0, "exception while retrieving user data " + exception);
} catch (SQLException exception) {
throw new ServiceException(0, "exception while retrieving user privilages " + name + exception);
}
// userValue = (UserDetails) rasUser;
if (rasUser == null)
throw new UsernameNotFoundException(name + " not found");
List<SimpleGrantedAuthority> auths = new
java.util.ArrayList<SimpleGrantedAuthority>();
for (String privilege : rasUser.getPermissions()) {
if (privilege != null && privilege.equalsIgnoreCase("RReportAdmin"))
{
auths.add(new
SimpleGrantedAuthority("ROLES_".concat(privilege)));
}
}
auths = auths.stream().distinct().collect(Collectors.toList());
authentication = new UsernamePasswordAuthenticationToken(name, password, auths);
return authentication;
}
의 login.jsp
<html>
<head>
<title>Login</title>
</head>
<body onload='document.loginForm.username.focus();'>
<h1>Spring Security Custom Login Form (XML)</h1>
<div id="login-box">
<h3>Login with Username and Password</h3>
<form name='loginForm'
action="<c:url value='/j_spring_security_check' />" method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='username'></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password' /></td>
</tr>
<tr>
<td colspan='2'><input name="submit" type="submit"
value="submit" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
로그
2017년 11월 7일 03 : 47 : 42,212 DEBUG o.s.s.w.u.m.AntPathRequestMatcher [HTTP-NIO-8080-간부-15] 요청의 확인 일치 : '/ 관리'; '/ admin'에 대해 2017-11-07 03 : 47 : 42,214 DEBUG o.s.s.a.A. AbstractSecurityInterceptor [http-nio-8080-exec-15] 보안 개체 : FilterInvocation : URL :/admin; 속성 : [hasRole ('ROLES_RReportAdmin')] 2017-11-07 03 : 47 : 42,214 이전에 인증 된 org-springframew[email protected]e68aaf8b : 주체 : rparwee; 자격증 명 : [PROTECTED]; 인증 됨 : true; 세부 사항 : org.sprin[email protected]1c07a : RemoteIpAddress : 127.0.0.1; SessionId : EE3501D56ED257409E40A4F8D5F6F794; 수여 기관 : ROLES_RReportAdmin 2017년 11월 7일 03 : 47 : 42,216 DEBUG ossavAffirmativeBased [HTTP-NIO-8080-간부-15] 유권자 : org.sp[email protected]6102b9a6, 반환 : -1 2017-11-07 03 : 47 : 42,219 TRACE oscsAbstractApplicationContext [http-nio-8080-exec-15] 네임 스페이스 'mvc-dispatcher-servlet'의 WebApplicationContext에 이벤트 게시 : org.springframework.security .access.event.AuthorizationFailureEvent [출처 = FilterInvocation : URL :/admin] 2017-11-07 03 : 47 : 42,219 DEBUG osswaExceptionTranslationFilter [http-nio-8080-exec-15] 액세스 권한이 (사용자가 아닙니다. 익명); org.springframework.security.access.AccessDeniedException을 AccessDeniedHandler에 위임 액세스가 org.springframework.security.access.vote.AffirmativeBased.decide (AffirmativeBased.java:84) ~ [봄 - 보안 - 코어 4.2에서 거부됩니다. 3.RELEASE.jar : 4.2.3.RELEASE] org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation (AbstractSecurityInterceptor.java:233) ~ [spring-security-core-4.2.3.RELEASE.jar] : 4.2.3.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:124) ~ [spring-security-web-4.2.3.RELEASE.jar : 4.2. 3.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter (Filter SecurityInterceptor.java:91) ~ [spring-security-web-4.2.3.RELEASE.jar : 4.2.3.RELEASE]
응답을 주셔서 감사합니다.하지만이 또한 추가 한 후 작동하지 않습니다. 나는 노력하고있어 사용자 이름과 암호를 하드 코딩을 시도했다. 그러나 DB에서 세부 정보를 가져 오는 동안 작동하지 않습니다. –
성공 로그 o.s.s.w.u.m.AntPathRequestMatcher [http-nio-8080-exec-25] 요청 일치 확인 : '/ admin'; against '/ admin **' o.s.s.a.A. AbstractSecurityInterceptor [http-nio-8080-exec-25] 보안 개체 : FilterInvocation : URL :/admin; 속성 : [hasRole ('ROLE_USER')] –
ossaiAbstractSecurityInterceptor [http-nio-8080-exec-25] 이전에 인증 됨 : org.springframew[email protected]840354ab : 주체 : org.springframework.security.core.userdetails . 사용자 @ c01cbded : 사용자 이름 : mkyong; 암호 : [PROTECTED]; 사용 : true; AccountNonExpired : true; credentialsNonExpired : true; AccountNonLocked : true; 허가 된 기관 : ROLE_USER; 자격증 명 : [PROTECTED]; 인증 됨 : true; 세부 사항 : org.sprin[email protected]2eb76 :; 부여 된 권한 : ROLE_USER –