2017-08-25 9 views
9

Próbuję zintegrować Spring Security w mojej wiosennej aplikacji internetowej. Zasadniczo muszę ukryć niektóre menu na podstawie pozwolenia użytkownika. Oto co zrobiłem.Wiosenne bezpieczeństwo hasPermission nie działa

Dodałem poniżej JARS w ścieżce klas.

spring-security-acl-4.0.2.RELEASE.jar 
spring-security-config-4.0.2.RELEASE.jar 
spring-security-core-4.0.2.RELEASE.jar 
spring-security-taglibs-4.0.1.RELEASE.jar 
spring-security-web-4.0.2.RELEASE.jar 

Poniżej znajdują się wpisy w web.xml

<context-param> 
    <param-name>log4jConfiguration</param-name> 
    <param-value>/WEB-INF/web_log4j.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring-root.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Napisałem CustomPermissionEvaluator klasy jak poniżej.

public class CustomPermissionEvaluator implements PermissionEvaluator{ 


@Override 
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { 
    HttpServletRequest request = (HttpServletRequest) targetDomainObject; 
    Profile userProfile = (Profile) request.getSession().getAttribute("testprofile"); 
    if (userProfile.getPermissionMap().get(String.valueOf(permission)) != null) { 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
public boolean hasPermission(Authentication arg0, Serializable arg1, 
     String arg2, Object arg3) { 
    // TODO Auto-generated method stub 
    return false; 
} 

}

Po tym pisałem plik SecurityConfig.

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Override 
public void configure(WebSecurity web) throws Exception { 
    DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler(); 
    handler.setPermissionEvaluator(new CustomPermissionEvaluator()); 
    web.expressionHandler(handler); 
} 

}

mam poniżej wpisów w moim wiosna-root.xml

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

Teraz w moim pliku JSP Używam poniżej TagLib.

i poniżej kod

<sec:authorize access="hasPermission('cadastra_categoria', #request)">  
       <div id="TEST"> 
       </div> 
      </sec:authorize> 

Ale to nie działa. Wszelkie sugestie zostaną docenione.

+0

Czy istnieje wskaźnik, błąd czy coś? Czy wywołanie hasPermission osiągnęło implementację po umieszczeniu punktu przerwania? Myślę, że brakuje filtrów bezpieczeństwa https://docs.spring.io/spring-security/site/docs/4.2.3.RELEASE/reference/htmlsingle/# ns-web-xml, ale jest to założenie – David

+0

Nie, nie dostaję żadnego błędu ani nie zadzwonię do osiągnięcia CustomPermissionEvaluator. –

+0

Czy jesteś pewien, że odwołujesz się do komponentu bean poprawnie? 'class =" main.java.com.config.CustomPermissionEvaluator "' - czy nie powinno to być bez 'main.java'? – aturkovic

Odpowiedz

0

Spróbuj hasAnyRole i sprawdzić raz tj

<sec:authorize access="hasAnyRole('ROLE_NAME')"> TEST </sec:authorize> 
+0

Potrzebuję hasPermission, która nie ma hasAnyRole. –

2

"hasPermission('cadastra_categoria', #request)"

Właściwie ważna rozmowa musi mieć argumenty zamienione, najpierw trzeba być przedmiotem domeny docelowej, a drugi - Uprawnienie:

hasPermission(#request, 'cadastra_categoria') 

Zakładam, że również dwukrotnie sprawdziłeś, czy zaimportowałeś taglib sec do strony JSP zgodnie z wymaganiami

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

I wreszcie, jak wyjaśniono w części 2-go tego answer zdefiniować następujące:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class AnnotationConfigDispatcherServletInitializer extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
    return new Class[] { 
     SecurityConfig.class //your SecurityConfig 
    }; 
    } 
} 

aby upewnić configure(WebSecurity web) nazywa się podczas uruchamiania aplikacji internetowej

+0

Zostaw to chłopaki Rozwiązałem mój problem wczoraj i zaktualizuję rozwiązanie. Dzięki za pomoc. –

2

jak rozumiem Twoje pytanie trzeba utworzono klasę CustomPermissionEvaluator, ale nie sprawdzasz za pomocą uprawnienia Uwierzytelnionego użytkownika.

ja bezpośrednio pisania kodu CustomPermissionEvaluator dla jasnego mojego punktu nie może być jakiś błąd:

public class CustomPermissionEvaluator implements PermissionEvaluator { 

    public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) { 
     if ((auth == null) || (targetDomainObject == null) || !(permission instanceof String)){ 
      return false; 
     } 

     Profile userProfile = (Profile) request.getSession().getAttribute("testprofile"); 
     String targetType = userProfile.getPermissionMap().get(String.valueOf(permission)); 

     return hasPrivilege(auth, targetType, permission.toString().toUpperCase()); 
    } 

    private boolean hasPrivilege(Authentication auth, String targetType, String permission) { 
     for (GrantedAuthority grantedAuth : auth.getAuthorities()) { 
      if (grantedAuth.getAuthority().startsWith(targetType)) { 
       if (grantedAuth.getAuthority().contains(permission)) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

    @Override 
    public boolean hasPermission(Authentication arg0, Serializable arg1, String arg2, Object arg3) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
} 
Powiązane problemy