복붙노트

[SPRING] JSP 페이지에서 hasPermission을 사용할 수 있도록 스프링 보안을 설정하는 방법은 무엇입니까?

SPRING

JSP 페이지에서 hasPermission을 사용할 수 있도록 스프링 보안을 설정하는 방법은 무엇입니까?

봄 프로젝트에서 내 JSP 페이지에 hasPermission을 사용하려고합니다. 나는 이미 내 컨트롤러 / 서비스 클래스의 메서드에서 아무 문제없이 이것을 사용한다. 기사 읽기 :

http://docs.spring.io/spring-security/site/docs/4.0.0.M1/reference/htmlsingle/#the-accesscontrollist-tag

공식 문서에서, 나는 그 일을 위해 사용자 정의 AclService 클래스에서로드 될 DefaultPermission에서 파생 된 클래스를 구현해야한다고 생각했습니다.

내 문제는 내가 그 모든 클래스를 구현하는 방법에 대한 정보를 찾을 수 없으며 심지어이 접근 방법이 유일한 것인지 또는 내가 올바른 방법으로 주제를 이해했는지 여부조차 모른다 (공식 문서는이 주제에 대해 매우 간단하다. , 그리고 인터넷의 나머지 부분에서 나는 더 많은 정보를 찾을 수 없다).

누구나 나를 올바른 방향으로 안내 할 수 있습니까? 아마도 튜토리얼이나 샘플 코드를 나타낼 수 있습니다.

최신 정보

StackOverflow에서 다른 주제를 읽고, 나는이 제안을 발견 :

>     public class MyPermissionEvaluator implements PermissionEvaluator {
>     ...
>     }
>     <beans:bean id="expressionHandler"
>         class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
>           <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>
>     </beans:bean>
>     
>     <beans:bean id="webExpressionHandler" 
>         class="com.bulb.learn.webapp.security.CustomWebSecurityExpressionHandler">
>         <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>
>     </beans:bean>
>     
>     <beans:bean id="permissionEvaluator" class="my.domain.MyPermissionEvaluator" />
>     <sec:authorize access="hasPermission(#childUnit, 'read')">
>          ...
>     </sec:authorize>

Custom PermissionEvaluator가 이미 있으므로이 방법을 시도합니다. 부분적으로 작동하지만 사용자가 권한을 가지고 있더라도 태그 안의 요소는 표시되지 않습니다. 또한 이클립스는 응용 프로그램이 빌드되고 오류없이 실행되었지만이 태그와 관련된 오류 ( '토큰에 대한 구문 오류, 잘못 배치 된 구문')를 나타냅니다.

콘솔에서이 오류가 표시됩니다.

un 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'cadastra_usuario' on object null
Jun 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'altera_usuario' on object null
Jun 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'remove_usuario' on object null
Jun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'cadastra_permissao' on object null
Jun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'altera_permissao' on object null
Jun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'remove_permissao' on object null
Jun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'cadastra_usuario' on object null
Jun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'altera_usuario' on object null
Jun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission
Advertência: Denying user klebermo permission 'remove_usuario' on object null

인터넷에서 WebSecurity Expression Handler 용 인터페이스를 구현해야한다고 제안하는 기사를 발견했습니다.

누구든지 올바른 단계를 알고 있습니까?

업데이트 2

이전에이 태그를 사용했습니다.

<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">

사용자가 주어진 객체에서 값 "1"또는 "2"로 표시되는 권한을 가지고있는 경우 표시됩니다.

</sec:accesscontrollist>

콘솔에 오류가 표시되지 않지만 여전히 작동하지 않습니다. 내 질문에 태그의 domainObject를 구현하기 위해 구현해야하는 객체는 무엇입니까?

해결법

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

    1.사용자 지정 PermissionEvaluator가 호출되지 않습니다.

    사용자 지정 PermissionEvaluator가 호출되지 않습니다.

    SecurityConfig.java에서 다음 코드를 시도하십시오.

    ...
    import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
    
    ...
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
      ...
    
      @Override
      public void configure(WebSecurity web) throws Exception {
        DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setPermissionEvaluator(new CustomPermissionEvaluator());
        web.expressionHandler(handler);
      }
    }
    

    WebApplicationInitializer

    ...
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    ...
    public class AnnotationConfigDispatcherServletInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    
      @Override
      protected Class<?>[] getRootConfigClasses() {
        return new Class[] {
          SecurityConfig.class,
        };
      }
    }
    
  2. ==============================

    2.

    <sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">
    

    someObject는 acl이 적용되어야하는 객체를 나타냅니다. 그래서 당신의 경우 childUnit 빈.

    참고로 나는 acl을 사용하지 않고 비슷한 것을했는데, 우리는 매개 변수라는 이름의 데이터베이스를 만들었습니다.

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

    3.필자의 경우에는 httpsession에 ArrayList라는 ArrayList가 있습니다. 버튼 함수 이름이 해당 목록에서 사용 가능한 경우에만 사용자에게 버튼을 표시해야합니다. 나는 스프링 보안 ACL을 통해 그것을 구현했다.

    필자의 경우에는 httpsession에 ArrayList라는 ArrayList가 있습니다. 버튼 함수 이름이 해당 목록에서 사용 가능한 경우에만 사용자에게 버튼을 표시해야합니다. 나는 스프링 보안 ACL을 통해 그것을 구현했다.

    클래스 경로에 ACL + 스프링 보안 코어 jar를 추가합니다.

    <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>${spring.security.version}</version>
        </dependency>       
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.security.version}</version>
        </dependency>       
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-acl</artifactId>
            <version>${spring.security.version}</version>
        </dependency>
    

    그런 다음 xml에 콩을 추가했습니다.

    <global-method-security pre-post-annotations="enabled">
      <expression-handler ref="expressionHandler"/>
    </global-method-security>    
    <beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
        <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>
    </beans:bean> 
    <beans:bean id="permissionEvaluator" class="com.config.BasePermissionEvaluator"/>
    

    핸들러 클래스 BasePermissionEvaluator를 호출하면이 클래스는 해당 버튼에 권한이 있으면 평가하고,

    public class BasePermissionEvaluator implements PermissionEvaluator{
     @Override
     public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
    
      boolean hasPermission = true;
      // targetDomainObject [101001, 102001, 103001, 201001, 202001, 203001, 204001, 205001, 206001, 301001, 302001, 303001]permission : 303001
        @SuppressWarnings("unchecked")
        List<String> functionList =(List<String>) targetDomainObject;       
        if(!functionList.contains(permission.toString())) {
            hasPermission = false;  
        }
      return hasPermission;
     }
    
     @Override
     public boolean hasPermission(Authentication authentication,
       Serializable targetId, String targetType, Object permission) {
        throw new RuntimeException("Id and Class permissions are not supperted by this application");
     }
    }
    

    마지막으로 jsp에서,

        <%@taglib uri="http://www.springframework.org/security/tags"
     prefix="sec"%>
    
    <sec:accesscontrollist hasPermission="101001"   domainObject="${USER_FUNCTIONS}"> 
                        <button type="reset" id ="clearMPId"><spring:message code="mp.clear"/></button>
      </sec:accesscontrollist>   
    

    희망이 도움이됩니다.

  4. from https://stackoverflow.com/questions/23974926/how-configure-the-spring-security-to-allow-the-use-for-haspermission-in-the-jsp by cc-by-sa and MIT license