2017-08-25 86 views
9

Yay Web sitemde Spring Security'i tümleştirmeye çalışıyorum. Temel olarak, kullanıcı iznine bağlı olarak bazı menüleri gizlemem gerekiyor. İşte yaptım.Yay güvenliği hashBeniyor çalışmıyor

Sınıf yolunda JARS'ın altına ekledim.

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 

Aşağıda 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> 

Ben aşağıdaki gibi bir sınıf CustomPermissionEvaluator yazdığı girişler bulunmaktadır.

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; 
} 

}

Bundan sonra ben SecurityConfig dosyasını yazdım. Şimdi benim JSP dosyasında ben taglib altında kullanıyorum

<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" /> 

@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); 
} 

}

benim bahar-root.xml girişler aşağıda var.

ve kod

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

altına

Ama çalışmıyor. Herhangi bir uyuşma takdir edilecektir.

hasPermission(#request, 'cadastra_categoria') 

: izni -

+0

bir gösterge, hata veya bir şey var mı:

Ben doğrudan herhangi bir hata olabilir net benim açımdan kodunu CustomPermissionEvaluator yazıyorum? Bir kesme noktası yerleştirdiğinizde hasPermission çağrısı uygulamaya ulaştı mı? Güvenlik filtresi zincirini kaçırdığınızı düşünüyorum. Https://docs.spring.io/spring-security/site/docs/4.2.3.RELEASE/reference/htmlsingle/# ns-web-xml ancak bunun bir varsayımı – David

+0

Hayır, ne bir hata alıyorum ne de CustomPermissionEvaluator'a ulaşmayı çağırıyorum. –

+0

Fasulyenize doğru bir şekilde referans yaptığınızdan emin misiniz? class = "main.java.com.config.CustomPermissionEvaluator" - main.java' olmadan bu olmamalı mıydı? – aturkovic

cevap

0

kez Aslında

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

İhtiyacım olan Hasarlı çalışmasına ihtiyacım varAnyRole. –

2

"hasPermission('cadastra_categoria', #request)"

yani hasAnyRole denemek ve kontrol edin, geçerli çağrı argümanlar takas zorundadır, ilki hedef alan nesne ve ikinci olmalı Ayrıca, sec taglib dosyasını JSP'nize gerektiği şekilde çift kontrol ettiğinizi varsayalım

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

Ve bu answer 2-nd kısmen açıklık olarak nihayet, aşağıdakileri tanımlayın: i var sorunuzu anlamak gibi

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

public class AnnotationConfigDispatcherServletInitializer extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 

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

web uygulaması başlatma

+0

Bırakın bırakın dün problemimi çözdüm ve çözüme kavuşacağım. Yardım için teşekkürler. –

2

sırasında denir emin olmak için configure(WebSecurity web)CustomPermissionEvaluator sınıfı oluşturuldu, ancak Kimliği doğrulanmış kullanıcı izninizi kontrol etmiyorsunuz.

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; 
    } 
}