@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.
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. –
@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