@PostAuthorize无法正常工作

时间:2018-04-22 05:34:42

标签: spring spring-mvc spring-security

我正在尝试构建一个简单的处理程序方法,该方法将阻止用户浏览属于不同用户的项目。方法如下:

$$OUT_PWD/MyExecutable/TARGET/MyExecutable.exe
$$OUT_PWD/MyLib/TARGET/MyLib.dll

所以主要的想法是将principal.username与存储在模型中的用户名进行比较。我正在使用Spring 5.0.5,安全性5.0.4。 Java Config无需启动。我的配置成立(amnogst其他的东西)

@PostAuthorize("principal.username == #model['username']")
@RequestMapping(value = "/show/{id}", method = RequestMethod.GET)
public String single(@PathVariable Long id, Model model)  {
    Item item = itemService.findById(id);
    model.addAttribute("item", item);
    model.addAttribute("username", item.getUser().getUsername());
    return "item";
}

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  ...
}

尽管如此,我还是能够通过直接URL访问不同用户的项目。任何提示都是受欢迎的。感谢

2 个答案:

答案 0 :(得分:2)

将此方法安全配置添加到您的项目中。此配置充当全局,当然还有proxyTargetClass = true,因此,spring也可以为您的控制器类生成代理。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
import org.springframework.security.oauth2.provider.expression.OAuth2MethodSecurityExpressionHandler;

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

    /*
        We can enable annotation-based security using the @EnableGlobalMethodSecurity annotation
        on any @Configuration instance. 

    */

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return new OAuth2MethodSecurityExpressionHandler();
    }
}

希望这能解决您的问题。

答案 1 :(得分:0)

好的,以防其他人遇到同样的问题。问题是我在Controller上使用@Pre/@PostAuthorize注释。控制器通常不在接口之后,并且默认情况下,配置行为的方面没有启动。

我的解决方案是在@EnableAspectJAutoProxyWebConfig上扫描包以搜索控制器:

@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"rs.saga.web"})
public class WebConfig implements WebMvcConfigurer {
   ...
}