首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring方法安全性导致自动连接对象的空值

Spring方法安全性导致自动连接对象的空值
EN

Stack Overflow用户
提问于 2019-05-21 19:30:40
回答 2查看 350关注 0票数 5

我曾经尝试过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";
    }
}

那么,这里可能出了什么问题呢?我不明白为什么这个类和其他类有不同的行为。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-22 03:09:24

Spring Security使用AOP (面向方面编程)将带注释的方法与AOP通知“包装”在一起。一旦调用了带有pre/post安全注释的方法,通知就会检查用户是否经过了身份验证和授权。如果该方法验证成功,则调用该方法,否则将遍历一些未授权/未验证的流。

Spring AOP只能在公共方法上执行运行时编织。showDispoPageshowCreateOrder都是私有的,这可能会干扰安全建议。

我会将pre/post授权注释移动到服务层。它不仅在控制器注释和安全注释之间提供了更好的分离,而且还防止了任何未来的错误。例如,在您当前的设置中,如果对UserService方法的任何调用是通过另一个忘记了安全注释的控制器调用的,则不会对这些调用进行验证。

此外,您还可以选择将web security (保护对URI的访问,例如保护/some/path)与当前的method level security设置一起使用。

票数 6
EN

Stack Overflow用户

发布于 2019-11-16 03:10:11

对于Kotlin用户,请确保方法不是最终的

浪费了两天。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56237329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档