【问题标题】:Authorizing methods in Spring MVC ControllerSpring MVC Controller 中的授权方法
【发布时间】:2013-06-13 20:45:10
【问题描述】:

我的目标是保护我的 Spring 2.5 MVC 控制器中的一些方法只能由特定用户访问,例如,管理者可以访问所有方法,但查看者可以访问其中的一些方法。虽然我必须访问会话对象才能知道当前登录的用户是否是经理。我有一个方法。

 public boolean isManager(HttpSession session){

//Dome some check
}

我要保护的控制器方法如下所示

@RequestMapping(value = "/getInfo", method = RequestMethod.GET)
    public ModelAndView getInfo(ModelMap model, HttpSession session) {

      //do something

        return new ModelAndView("info_page", model);
    }

因此,在上述方法中,我希望有注释,仅允许经理访问该方法。

例如,我想要这样的东西

@RolesAllowed(AcessType.ManagerOnly)   
@RequestMapping(value = "/getInfo", method = RequestMethod.GET)
    public ModelAndView getInfo(ModelMap model, HttpSession session) {

      //do something

        return new ModelAndView("info_page", model);
    }

我见过thisquestion,但它没有帮助我如何将角色(经理或其他)传递给注释并完成工作。

我是否必须创建 AccessType 枚举。并根据会话设置角色?我们已经使用 Spring Security 进行身份验证和授权。

任何帮助将不胜感激!

【问题讨论】:

    标签: java authentication spring-mvc spring-security annotations


    【解决方案1】:

    您需要实现spring security。请参阅链接以获取开始查找和谷歌搜索的地方,我认为,作为关于这个主题的完整教程,超出了这个问题的范围。当您实现了 spring 安全上下文时,每个用户都将具有关联的角色,您可以像您的示例一样使用 @RolesAllowed 注释。

    Here's a blog 指导您通过 spring 实现自己的安全过滤器。

    -- 回应评论:

    Spring 安全性也可以与自定义角色一起使用。在 spring 安全上下文中,您可以定义身份验证提供程序:

    <authentication-provider user-service-ref='daoAuthenticationProvider'>
        <password-encoder hash="md5"/>
    </authentication-provider>
    <beans:bean id="daoAuthenticationProvider" class="com.custom.DaoAuthenticationProvider"/>
    

    并扩展 AbstractUserDetailsAuthenticationProvider。在这里,您可以使用自定义代码为特定用户提供 UserDetails 对象。 UserDetails 对象将具有您想用来限制其他地方访问的角色。

    【讨论】:

    • 谢谢,但角色是自定义的。它们没有在 SPRING_SECURITY_CONTEXT 中定义,而是在另一个对象的会话中的某个位置。如何使用该会话来获取角色并在注释中使用它?仅供参考:我使用的是 Spring 2.5。我正在浏览本教程,但不确定是否可以在 Spring 2.5 中完成
    • 扩展了答案。希望这有助于您的实施。我知道弹簧安全配置一开始可能会有点混乱。
    【解决方案2】:

    我已经在我的博客中解释了相同的场景,您可以参考博客文章available here 这里我使用了基于 Spring Security AOP 的授权。使用基于 Spring Security AOP 的授权,您可以在方法声明之上使用带有角色名称的 @Secured 注释,以仅允许定义用户角色的访问。

    //access will be granted only the users with ROLE_MANAGER
    @Secured("ROLE_MANAGER")
    public ModelAndView showManagerHomePage(){
    
    }
    
    //access will be granted only the users with ROLE_MANAGER or ROLE_ADMIN
    @Secured({"ROLE_MANAGER","ROLE_ADMIN"})
    public ModelAndView showAdminUserHomePage(){
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 2015-11-18
      • 2020-08-13
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2014-12-03
      相关资源
      最近更新 更多