我正在尝试构建一个简单的处理程序方法,该方法将阻止用户浏览属于不同用户的项目。方法如下:
$$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访问不同用户的项目。任何提示都是受欢迎的。感谢
答案 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
注释。控制器通常不在接口之后,并且默认情况下,配置行为的方面没有启动。
我的解决方案是在@EnableAspectJAutoProxy
类WebConfig
上扫描包以搜索控制器:
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"rs.saga.web"})
public class WebConfig implements WebMvcConfigurer {
...
}