2017-11-07 5 views
0

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]

답변

0

는/내가 내 실수를 가지고

+0

응답을 주셔서 감사합니다.하지만이 또한 추가 한 후 작동하지 않습니다. 나는 노력하고있어 사용자 이름과 암호를 하드 코딩을 시도했다. 그러나 DB에서 세부 정보를 가져 오는 동안 작동하지 않습니다. –

+0

성공 로그 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')] –

+0

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 –

0

을 환영합니다 "('ROLE_RReportAdmin') hasRole"

access="permitAll" in Spring-security.xml for login-page="/login" 

는 또한 = 액세스 추가 보시기 바랍니다. 승인을 확인하기 전에 봄에 "역할"을 확인하십시오. 내 경우에는 "롤"을 추가하고 있었다.

코드 차단 - URL 패턴 = "/ 관리자 **"액세스 = "hasRole ('ROLES_RReportAdmin')"로 차단 - URL 패턴 = "/ 관리자 **"액세스 = "hasRole ('ROLE_RReportAdmin 변경 ') "