복붙노트

[SPRING] JSP EL 표현식에서 Spring Security Principal 가져 오기

SPRING

JSP EL 표현식에서 Spring Security Principal 가져 오기

Spring MVC와 Spring Security 버전 3.0.6을 사용하고 있습니다. 내 JSP에서 사용자 이름을 얻는 가장 쉬운 방법은 무엇입니까? 또는 사용자가 로그인했는지 여부도 알 수 있습니까? 나는 몇 가지 방법을 생각할 수 있습니다.

이와 같은 스크립틀릿을 사용하여 사용자가 로그인했는지 확인하십시오.

<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
    .getAuthentication().getPrincipal().equals("anonymousUser")
    ? "false":"true"%>

나는 scriptlet을 사용하는 팬이 아니기 때문에 이것을 태그에서 사용하고 싶습니다.이 태그는 페이지 속성으로 되돌려 놓아야합니다.

내 @Controller에서 SecurityContextHolder를 다시 사용하여 모델에 넣을 수 있습니다. 하지만 모든 페이지에서이 기능이 필요하므로 모든 컨트롤러에이 로직을 추가하지 않아도됩니다.

이 일을하는 더 깨끗한 방법이 있다고 의심합니다 ...

해결법

  1. ==============================

    1.Spring 보안 태그를 확인하십시오 :

    Spring 보안 태그를 확인하십시오 :

    http://static.springsource.org/spring-security/site/docs/3.0.x/reference/taglibs.html

    로그 된 경우 다음을 확인할 수 있습니다.

    <sec:authorize access="isAuthenticated()"> 
    

    c 대신에 : if

  2. ==============================

    2.스레드에 다른 답변이 있다는 것을 알고 있지만 아무도 사용자가 인증되었는지 확인할 수있는 방법에 대해서는 답변하지 않았습니다. 그래서 나는 내 코드가 좋아하는 것을 공유하고있다.

    스레드에 다른 답변이 있다는 것을 알고 있지만 아무도 사용자가 인증되었는지 확인할 수있는 방법에 대해서는 답변하지 않았습니다. 그래서 나는 내 코드가 좋아하는 것을 공유하고있다.

    프로젝트에 tag lib를 포함하십시오.

    <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
    

    그런 다음 다음을 추가하여 현재 범위에 사용자 객체를 만듭니다.

    <sec:authentication var="user" property="principal" />
    

    그런 다음 추가하여 쉽게 사용자 이름을 표시 할 수 있습니다. 스프링 보안을 프로젝트의 다른 클래스로 변경하는 방법을 구현하지 않았다면 'principal'객체는 일반적으로 유형 문자열이라는 것을 기억하십시오.

    <sec:authorize access="hasRole('ROLE_USER') and isAuthenticated()">
    ${user}
    </sec:authorize>
    

    이 기능이 사용자 역할을 확인하는 데 도움이되기를 바랍니다.

    Maven을 사용하고 있다면이 스레드에서 Christian Vielma가 언급 한 종속성 태그를 추가하십시오.

    감사!

  3. ==============================

    3.다음과 같이 사용할 수 있습니다. 봄 보안 태그 라이브러리 - 3.1.3.RELEASE

    다음과 같이 사용할 수 있습니다. 봄 보안 태그 라이브러리 - 3.1.3.RELEASE

    <sec:authentication var="principal" property="principal" />
    

    그리고:

    ${principal.username}
    
  4. ==============================

    4.Maven을 사용하여 taglibs 라이브러리를 pom.xml에 추가해야했습니다.

    Maven을 사용하여 taglibs 라이브러리를 pom.xml에 추가해야했습니다.

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>
    

    그럼 내 JSP로 추가 :

    <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
    

    과:

    <sec:authentication property="principal" />
    

    principal.username은 계속 오류를 발생 시켰습니다 (아마도 UsernamePasswordAuthenticationToken 객체를 작성한 방법 일 수 있습니다.).

  5. ==============================

    5.나는 alephx에 동의하고 심지어 그의 대답에 투표했다.

    나는 alephx에 동의하고 심지어 그의 대답에 투표했다.

    그러나 다른 접근 방법이 필요하다면 Spring Roo가 사용하는 방법을 사용할 수 있습니다.

    SecurityContextHolderAwareRequestFilter가있는 경우 SecurityContext에 액세스하는 요청 랩퍼를 사용하여 표준 서블릿 API 보안 메소드를 제공합니다.

    이 필터는 Spring Security 네임 스페이스의 태그로 등록됩니다. FilterChainProxy의 보안 필터 체인에 등록 할 수도 있습니다 (applicationContext-security.xml에 선언 된 bean에 대한 참조 만 추가하면됩니다)

    그런 다음 Roo가 수행하는 것처럼 보안 서블릿 API에 액세스 할 수 있습니다 (footer.jspx를 찾아 조건부 로그 아웃 링크가 작성되는 방법을 확인하십시오)

      <c:if test="${pageContext['request'].userPrincipal != null}">
    <c:out value=" | "/>
    ...
    

  6. ==============================

    6.나는 Authentication.getPrincipal ()에 의해 반환 된 타입이 Object, 즉 : UserDetail (위의 경우 작동 할 수 있음), String 또는 String이 될 수 있으므로 이 항상 작동하지 않는다고 생각합니다. 다른 것.

    나는 Authentication.getPrincipal ()에 의해 반환 된 타입이 Object, 즉 : UserDetail (위의 경우 작동 할 수 있음), String 또는 String이 될 수 있으므로 이 항상 작동하지 않는다고 생각합니다. 다른 것.

    JSP 페이지에서 사용자 이름을 표시하기 위해 $ {pageContext.request.userPrincipal.name}을 사용합니다.

    String를 돌려주는 java.security.Principal.getName ()를 사용합니다.

  7. ==============================

    7.이것은 사용자가 로그인했는지 여부에 관계없이 작동하며 익명 인증을 사용할 때 작동합니다.

    이것은 사용자가 로그인했는지 여부에 관계없이 작동하며 익명 인증을 사용할 때 작동합니다.

    <sec:authorize access="isAuthenticated()">
        <sec:authentication property="principal.username" var="username" />
    </sec:authorize>
    <sec:authorize access="!isAuthenticated()">
        <sec:authentication property="principal" var="username" />
    </sec:authorize>
    

    후에...

    Hello ${username}
    
  8. ==============================

    8.기본적으로 Spring Security 3.0.x에서는 SecurityContextHolderRquestAwareFilter를 설치하므로 HttpServletRequest.getUserPrincipal ()을 호출하여 Authentication 객체를 가져올 수 있으며 HttpServletRequest.isUserInRole ()을 호출하여 역할을 쿼리 할 수도 있습니다.

    기본적으로 Spring Security 3.0.x에서는 SecurityContextHolderRquestAwareFilter를 설치하므로 HttpServletRequest.getUserPrincipal ()을 호출하여 Authentication 객체를 가져올 수 있으며 HttpServletRequest.isUserInRole ()을 호출하여 역할을 쿼리 할 수도 있습니다.

  9. ==============================

    9.j 태그는 다음과 같습니다.

    j 태그는 다음과 같습니다.

    <%@taglib prefix="j" uri="http://java.sun.com/jsp/jstl/core" %>
    

    초 태그 :

    <%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
    

    Adet the Hammer :

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>
    

    페이지에 추가 :

    <sec:authentication var="principal" property="principal"/>
    <j:choose>
        <j:when test="${principal eq 'anonymousUser'}">
              NOT AUTHENTICATED
        </j:when>
        <j:otherwise>
              AUTHENTICATED
        </j:otherwise>
    </j:choose>
    
  10. ==============================

    10.1) 추가 필드 모바일을 갖춘 내 사용자 등급 :

    1) 추가 필드 모바일을 갖춘 내 사용자 등급 :

     public class SiteUser extends User {
    
        public SiteUser(String username, String password, Collection<? extends GrantedAuthority> authorities,
                String mobile) {
            super(username, password, true, true, true, true, authorities);
            this.mobile = mobile;
        }
    
        private String mobile;
    
        public String getMobile() {
            return mobile;
        }
    
        public void setMobile(String mobile) {
            this.mobile = mobile;
        }
    
    }
    

    2) 내 UserDetailsServiceImpl.java에서 이 사용자 지정 SiteUser 개체를 게시했습니다.

    public SiteUser loadUserByUsername(String username)  {
            UserInfoVO userInfoVO = userDAO.getUserInfo(username);
            GrantedAuthority authority = new SimpleGrantedAuthority(userInfoVO.getRole());
    
            SiteUser siteUser = new SiteUser(userInfoVO.getUsername(), userInfoVO.getPassword(),
                    Arrays.asList(authority), userInfoVO.getMobile());
    
            return siteUser;
    }
    

    3) 그리고 나는 그것을 다음과 같이 접근하고있다 :

  11. from https://stackoverflow.com/questions/9048995/get-spring-security-principal-in-jsp-el-expression by cc-by-sa and MIT license