2013-05-31 55 views
0

如何動態生成「攔截url」。我的用戶名和角色存儲在數據庫中, 我想將所有這些用戶映射到spring安全性。是否有任何方法可以執行此操作?春季安全動態添加用戶和權限

+0

你能更具體地說明你的目標是什麼嗎?你想保護用戶特定的URL(例如'/ my-app/user/{userName}/**')? –

+0

是的,我想保護URL。但是,哪個用戶有權訪問我想要存儲在數據庫中的數據的頁面。 – vijay

+0

Spring的'WebExpressionVoter'可能會讓你感興趣。 –

回答

-1

給你的所有用戶相同的角色,並在配置中使用這個角色。

你可以閱讀關於雲燕角色here

+0

Thanx回覆。但是這個鏈接無法幫助我解決問題。 – vijay

0

您必須提供自己的實現com.icod.solapCore.spring.security.FilterInvocationSecurityMetadataSource的。

這可能是這樣的:

public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource { 

     @Override 
     public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException { 
     FilterInvocation filterInvocation = (FilterInvocation) object; 
     HttpServletRequest request = filterInvocation.getHttpRequest(); 
     Collection<ConfigAttribute> result = new ArrayList<ConfigAttribute>(); 
     // Find roles in database that secures the specified request 
     // ... 
     // For any role found, create a SecurityConfig object prefixed with "ROLE_" ex : 
     // for(String role : roles) { 
     // ConfigAttribute attribute = new SecurityConfig("ROLE_"+roleFound); 
     // result.add(attribute); 
     // } 

     return result; 
     } 

     @Override 
     public Collection<ConfigAttribute> getAllConfigAttributes() { 
     return null; 
     } 

     @Override 
     public boolean supports(Class<?> clazz) { 
     return FilterInvocation.class.isAssignableFrom(clazz); 
     } 
} 

然後你必須用自己的替換默認FilterInvocationSecurityMetadataSource。我用一個BeanPostProcessor來做,在Spring讀取配置文件之後調用,但在它使配置正式之前調用。看起來是這樣的:

public class MyFilterInvocationSecurityMetadataSourceBeanPostProcessor implements BeanPostProcessor { 

    private FilterInvocationSecurityMetadataSource metadataSource = new MyFilterInvocationSecurityMetadataSource(); 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { 
    if (bean instanceof FilterInvocationSecurityMetadataSource) { 
     return metadataSource; 
    } 
    return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String name) throws BeansException { 
    return bean; 
    } 
} 

然後你只需要配置bean後置處理器:

<bean id="solapcoreFilterInvocationSecurityMetadataSourceBeanPostProcessor" class="foo.bar.MyFilterInvocationSecurityMetadataSourceBeanPostProcessor"/> 

希望這有助於。