2012-07-26 20 views
6

Şu anda yöntem çağrılarını güvenli hale getirmek için yaylı güvenlik ve @PreAuthorize ek notlarını kullanıyorum. Şimdi kimlik doğrulama belirtecini değiştirmek istediğim bir yöntem çağrısı için run-as authentication replacement yaylı güvenlik yapmamı sağlıyor.Yay güvenliği ile yöntem çağrısı için güvenlik bağlamını değiştir

Değiştirme, bir yöntem tabanı başına yapılandırabilir mi? Açıklama başına, SpEL ifadesi .... Değilse, runAsManager'da hangi yöntemin çağrıldığını bulmak mümkün olabilir mi? Güvenli bir nesne için güvenlik yapılandırma özniteliklerini nasıl yapılandırabilirim?

cevap

1

Kendi başlattığım yöntemde özel bir ek açıklama olup olmadığını kontrol eden ve uygun Simgeyi döndüren kendi RunAsManager'u uygulayarak bunu çözdüm.

harika çalışıyor.

6

@PreAuthorize ile birlikte Run-As uygulamasını uygulamak için a detailed article gönderdim.

1) Kendi özel mantığınıza dayalı yöntem yürütme sırasında kullanmak üzere Authentication'u oluşturan kendi RunAsManager'u uygulayın. Aşağıdaki örnekte ekstra rol sağlayan özel bir ek açıklama kullanır:

public class AnnotationDrivenRunAsManager extends RunAsManagerImpl { 

     @Override 
     public Authentication buildRunAs(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) { 
      if(!(object instanceof ReflectiveMethodInvocation) || ((ReflectiveMethodInvocation)object).getMethod().getAnnotation(RunAsRole.class) == null) { 
       return super.buildRunAs(authentication, object, attributes); 
      } 

      String roleName = ((ReflectiveMethodInvocation)object).getMethod().getAnnotation(RunAsRole.class).value(); 

      if (roleName == null || roleName.isEmpty()) { 
       return null; 
      } 

      GrantedAuthority runAsAuthority = new SimpleGrantedAuthority(roleName); 
      List<GrantedAuthority> newAuthorities = new ArrayList<GrantedAuthority>(); 
      // Add existing authorities 
      newAuthorities.addAll(authentication.getAuthorities()); 
      // Add the new run-as authority 
      newAuthorities.add(runAsAuthority); 

      return new RunAsUserToken(getKey(), authentication.getPrincipal(), authentication.getCredentials(), 
        newAuthorities, authentication.getClass()); 
     } 
    } 

korumalı yönteme özel @RunAsRole ek açıklama arayacaktır Bu uygulama (örn @RunAsRole("ROLE_AUDITOR")) ve bulursa, içinde (ROLE_AUDITOR verilen yetkiyi katacak Bu dava) verilen makamların listesine. RunAsRole'un kendisi sadece basit bir özel açıklamadır. bu kayıt)

<bean id="runAsManager" 
    class="org.springframework.security.access.intercept.RunAsManagerImpl"> 
    <property name="key" value="my_run_as_key"/> 
</bean> 

3:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface RunAsRole { 
    String value(); 
} 

2) yöneticisi örneğini

<global-method-security pre-post-annotations="enabled" run-as-manager-ref="runAsManager"> 
    <expression-handler ref="expressionHandler"/> 
</global-method-security> 

4) bir denetleyicisi Örnek kullanım:

@Controller 
public class TransactionLogController { 

    @PreAuthorize("hasRole('ROLE_REGISTERED_USER')") //Authority needed to access the method 
    @RunAsRole("ROLE_AUDITOR") //Authority added by RunAsManager 
    @RequestMapping(value = "/transactions", method = RequestMethod.GET) //Spring MVC configuration. Not related to security 
    @ResponseBody //Spring MVC configuration. Not related to security 
    public List<Transaction> getTransactionLog(...) { 
    ... //Invoke something in the backend requiring ROLE_AUDITOR 
    { 

    ... //User does not have ROLE_AUDITOR here 
} 

DÜZENLEME: RunAsManagerImpl'daki key değeri istediğiniz herhangi bir şey olabilir. İşte kullanımına Spring docs dan alıntı:

zararlı kod tüm oluşturulan jeton depolanan bir anahtarın bir RunAsUserToken ve RunAsImplAuthenticationProvider tarafından garanti kabulü için mevcut bunu, karma yaratmaz sağlamak. RunAsManagerImpl ve RunAsImplAuthenticationProvider aynı anahtarla fasulye bağlamında oluşturulur: aynı anahtarı kullanılarak

<bean id="runAsManager" 
    class="org.springframework.security.access.intercept.RunAsManagerImpl"> 

<bean id="runAsAuthenticationProvider" 
    class="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider"> 

, her RunAsUserToken geçerli olabilir oluşturulduğu tarafından onaylanmış RunAsManagerImpl.Güvenlik nedenleriyleoluşturulduktan sonra RunAsUserToken değiştirilemez.

+0

Tam olarak ne "my_run_as_key" için kullanılır? - Bunu anlayamıyorum. Muhtemelen burada yazdığınız aynı rehberi okudum, ama bu anahtar bana hiç mantıklı gelmiyor. –

+0

@DanielBo Değer, istediğiniz herhangi bir şey olabilir. Temelde bir şifre. Bahar belgelerine neden ihtiyaç duyulduğunu teklif etmek için cevabı güncelledim. – kaqqao

İlgili konular