我曾经尝试过spring证券方法安全性,得到了一个非常奇怪的行为。我有几个控制器类,这些方法用@PreAuthorize进行注释,以限制某些用户角色的访问。
在添加方法安全性后,有一个Controller类的注入对象为空。我调试了我的代码,发现了以下内容:
service和userService是注入的对象
@Controller
public class OrderController {
@Autowired
private OrderService service;
@Autowired
private UserService userService;
对我来说奇怪的是它的价值描述: OrderController$$EnhancerBySpringCGLIB$$1a7122f6.通过删除所有MethodSecurity注释,该类按预期工作。
当我查看同样使用方法安全性的其他控制器类时,它们工作得很好,调试器中的变量列表看起来也没问题:
@Controller
public class UserController {
@Autowired
private UserService service;
我还搜索了可能对注释造成的错误,但OrderController中的注释看起来与其他控制器类中的相同。下面是OrderController类的示例:
@Controller
public class OrderController {
.
.
.
@GetMapping("/dispo/dispo")
@PreAuthorize("hasAuthority('ADMIN') or hasAuthority('DISPATCH')")
private String showDispoPage() {
return "/dispo/dispo";
}
@GetMapping("/dispo/orderCreate")
@PreAuthorize("hasAuthority('ADMIN') or hasAuthority('AL_SYNC_ADMIN') or hasAuthority('CLIENT_USER') or hasAuthority('DISPATCH')")
private String showCreateOrder(Model model) {
List<MdUser> userList = service.getUsers();
model.addAttribute("userList", userList);
return "/dispo/orderCreate";
}
}
下面是另一个Controller类的示例,它的工作方式与预期一致:
@Controller
public class UserController {
.
.
.
@GetMapping("/admin/user")
@PreAuthorize("hasAuthority('ADMIN') or hasAuthority('DISPATCH') or hasAuthority('WEBTOOL_USER')")
public String showInvalidUserPage(Model model) {
List<UserModel> invalidUserList = service.findInvalidUsers(service.getUsers());
model.addAttribute("userList", invalidUserList);
return "/admin/user";
}
@GetMapping("/admin/userCreate")
@PreAuthorize("hasAuthority('ADMIN')")
public String showNewUserPage(Model model) {
UserModel user = new UserModel();
model.addAttribute("user", user);
return "/admin/userCreate";
}
}
那么,这里可能出了什么问题呢?我不明白为什么这个类和其他类有不同的行为。
发布于 2019-05-22 03:09:24
Spring Security使用AOP (面向方面编程)将带注释的方法与AOP通知“包装”在一起。一旦调用了带有pre/post安全注释的方法,通知就会检查用户是否经过了身份验证和授权。如果该方法验证成功,则调用该方法,否则将遍历一些未授权/未验证的流。
Spring AOP只能在公共方法上执行运行时编织。showDispoPage
和showCreateOrder
都是私有的,这可能会干扰安全建议。
我会将pre/post授权注释移动到服务层。它不仅在控制器注释和安全注释之间提供了更好的分离,而且还防止了任何未来的错误。例如,在您当前的设置中,如果对UserService
方法的任何调用是通过另一个忘记了安全注释的控制器调用的,则不会对这些调用进行验证。
此外,您还可以选择将web security
(保护对URI的访问,例如保护/some/path
)与当前的method level security
设置一起使用。
发布于 2019-11-16 03:10:11
对于Kotlin用户,请确保方法不是最终的!
浪费了两天。
https://stackoverflow.com/questions/56237329
复制相似问题