Spring安全性@PreAuthorize hasRole()属性注入

时间:2013-08-13 10:55:24

标签: java spring-security

假设我的Spring Security和属性配置正确,我想使用属性中的角色名称,如

@PreAuthorize("hasRole('${role.rolename}')")
public void method() {}

我在上面的代码示例中尝试了但它不起作用(需要'$ {role.rolename}'字符串作为比较的角色)

如果我切换到

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void method() {}

它运作得很好。 我对这种用法的动机是在各种环境下的应用程序测试中具有更好的灵活性。

3 个答案:

答案 0 :(得分:11)

尝试删除''标志:

@PreAuthorize("hasRole(${role.rolename})")
public void method() {}

编辑。我确信有更好的方法,但作为解决方法,您可以在某个bean上调用某些方法:

@Component("appVariablesHolder")
public class AppVariablesHolder {

    @Value("${role.rolename}") 
    private String someRole;

    public String getSomeRole() {
        return this.someRole;
    }
}

@PreAuthorize("hasRole(@appVariablesHolder.getSomeRole())")
public void method() {}

答案 1 :(得分:1)

我发现你可以抓住propertyResolver直接从中获取值,而不是像@Maksym所建议的那样编写你自己的类。

Exammple:

@PreAuthorize("hasRole(@environment.getProperty('role.rolename')")
public void method() {}

答案 2 :(得分:0)

基于此处的其他答案,令我震惊的一件事不是在import React, { Component } from 'react'; import { Text, View } from 'react-native'; import Channel from '../channel/channel.component'; import styles from './presentation.component.styles'; var TVEventHandler = require('TVEventHandler'); export default class Grid extends Component { constructor(props){ super(props); this.state = { command: 'undefined' } } setcomand( command) { this.setState( () => { return { command: command }; }); } _tvEventHandler: null; _enableTVEventHandler() { this._tvEventHandler = new TVEventHandler(); this._tvEventHandler.enable(this, function(cmp, evt) { if (evt && evt.eventType === 'right') { setcomand('Press Right!'); } else if(evt && evt.eventType === 'up') { setcomand('Press Up!'); } else if(evt && evt.eventType === 'left') { setcomand('Press Left!'); } else if(evt && evt.eventType === 'down') { setcomand('Press Down!'); } }); } _disableTVEventHandler() { if (this._tvEventHandler) { this._tvEventHandler.disable(); delete this._tvEventHandler; } } componentDidMount() { this._enableTVEventHandler(); console.warn("component did mount"); } componentWillUnmount() { this._disableTVEventHandler(); console.warn("component Will Unmount"); } render() { return ( <View style={styles.container}> <Text>{this.state.command}</Text> <Channel name="Globo" description="Its brazilian TV channles for news"/> <Channel name="TVI" description="Its Portuguese TV channles for news"/> <Channel name="TVI" description="Its Portuguese TV channles for news"/> </View> ); } } 上设置上下文。

请确保在您的OAuth2MethodSecurityExpressionHandler中加载了上述答案的上下文。

MethodSecurityConfig

那么您就可以成功访问

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Autowired
    private ApplicationContext context;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        OAuth2MethodSecurityExpressionHandler handler = new OAuth2MethodSecurityExpressionHandler();
        handler.setApplicationContext(context);

        return handler;
    }
}