2012-06-16 2 views
0

spring_security_check를 사용하여 로그인 페이지를 만들었습니다. 여기
:
j_username에 spring_security_check를 사용하여 액세스 할 수 없습니다.

<form name='f' action="/sec_test/j_spring_security_check" method='POST'> 

    <table> 
     <tr> 
      <td>User:</td> 
      <td><input type="text" name="j_username" value=''> 
      </td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type="password" name="j_password" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan='2'><input name="submit" type="submit" 
       value="submit" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan='2'><input name="reset" type="reset" /> 
      </td> 
     </tr> 
    </table> 
</form> 

하지만 이후 j_username에 액세스 할 수 없습니다.

나는 시도했다 :

* request.getParameter ("j_username")
* request.getAttribute ("j_username")
* request.getAttribute ("j_username")
* request.getUserPrincipal() .getName()
* request.getRemoteUser()

모두에서 내가 얻는 것은 null입니다!

어떻게해야할까요?

+0

내가 session.getAttribute ("SPRING_SECURITY_LAST_USERNAME") 아직도 내가 널지고있어 사용했던 것을 추가해야합니다. –

답변

2

스프링은 구성 파일에 구성된 인증 유형에 따라 인증을 수행합니다. 인증이 성공하면 로그인 성공 URL (/login.htm)로 리디렉션됩니다. /login.htm으로 리디렉션되기 때문에 재정의 된 인증 필터에서 요청에 명시 적으로 설정하지 않는 한 요청 매개 변수 (사용자 이름/사용자 역할)를 얻지 못합니다.

인증 성공 후 인증 된 정보는 사용자 역할을 포함하여 보안 컨텍스트에 저장됩니다. SecurityContext에서이 정보에 액세스 할 수 있습니다. 참조 - link

+0

감사합니다. @sunil. ** 인증 auth = SecurityContextHolder.getContext()를 시도했습니다.getAuthentication(); 문자열 이름 = auth.getName(); ** 그리고 효과가있었습니다. –

0

스프링 구성 파일을보고 싶습니다. 그럼에도 불구하고 스프링 보안이 실제로 사용자를 대신 할 때 사용자 자격 증명의 유효성을 검사하는 것으로 보입니다. 시작하는 방법을 잘 모르겠다면 온라인 설명서를 비롯하여 봄의 문서를 읽어보십시오. 당신이 봄이 사용자의 자격 증명을 검증 한 후, 사용자 이름에 액세스 할 수 같은 것을 할하려면

<security:http auto-config="true" use-expressions="true" access-denied-page="/login.html"> 
    <security:form-login 
     login-page="/login.html" 
     authentication-failure-url="/loginfail.html" 
     default-target-url="/authenticate.html"/> 

    <security:logout 
     invalidate-session="true" 
     logout-success-url="/login.html" 
     logout-url="/logoff.html"/> 
</security:http> 

<bean id="securityDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/security_DS"/> 
    <property name="resourceRef" value="true"/> 
</bean> 

<bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" /> 

<security:authentication-manager> 
    <security:authentication-provider> 
     <security:password-encoder ref="encoder" /> 
     <security:jdbc-user-service 
      data-source-ref="securityDataSource" 
      authorities-by-username-query="SELECT l.user_name as username, r.role_name AS authority FROM login l join user_role ur on l.user_id = ur.user_id join role r on ur.role_id = r.role_id WHERE l.user_name = ?" 
      users-by-username-query="SELECT user_name as username, password_value AS password, active_flg AS enabled FROM login WHERE user_name = ?" 
     />   
    </security:authentication-provider> 
</security:authentication-manager> 

:

@RequestMapping(value = { "/authenticate.html" }, method = { RequestMethod.GET, RequestMethod.HEAD }) 
public ModelAndView authenticateUser(final HttpServletRequest httpServletRequest, HttpSession httpSession, Authentication authentication) { 
    User user = (User) authentication.getPrincipal(); 
    String userName = user.getUsername(); 
    ... 

당신은 것을 볼 수 있습니다 여기처럼 내 봄 보안 설정이 어떻게 표시되는지를 보여줍니다 요청은 Spring 구성에서 지정한 default-target-url을 기반으로 /authenticate.html 메소드로 전달됩니다.

+0

사실 스프링이 이미 그렇게했을 때 사용자 이름/비밀번호의 유효성 확인과 같은 일에 관심이 없습니다. 내가 원하는 것은 로그인 페이지 다음에 다른 모든 페이지의 맨 위에 j_username을 표시하는 것입니다. 아직도 나는 그것에 접근 할 수 없다. –

+0

j_username은 "j_username"이라는 이름으로 액세스되지 않으므로 request.getParameter ("j_username")를 통해 액세스 할 수 없습니다. 대신, 이미 언급 한 것처럼 Authentication 개체를 통해 액세스 할 수 있습니다. 참조 (http://stackoverflow.com/questions/5042983/how-can-i-get-j-username-on-my-index-jsp-after-successful-authentication-with-j) –

+0

나에게 제공 할 수 있습니다. 답변 자바 버전? 나는 그 대답을 전에 따라 갔다. 나는 아무것도 얻지 못했다. –

관련 문제