首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Spring控制器创建通用权限管理系统?

如何为Spring控制器创建通用权限管理系统?
EN

Stack Overflow用户
提问于 2012-12-17 21:44:29
回答 1查看 941关注 0票数 0

我正在做一个基于浏览器的游戏。假设我有一个弹簧控制器,很多控制器~10,每个控制器都有10个url映射。这类似于100+映射方法。

如果满足某些规则,每个映射只会加载或显示正确的内容。规则将通过执行DB查询来检查。,例如

我是12级用户,只有当用户是10+、20+、30+、40+、50+等级别时,每个控制器才允许显示内容。

我可以在每个控制器中的每个映射方法下执行查询,但是boilerplating.太多了。

是否有一种方法来实现它的集中化,比如将我的限制映射放在一起,而不必把它放在每个url映射方法下?

即使设计中可能没有这样的东西,也许你自己也有过同样的问题,并且想出了一些聪明的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2012-12-18 13:35:26

我建议您在定制的spring-security中使用PermissionEvaluator,这样基本上可以在网页和控制器中使用相同的实现:

在网页中,您可以使用:

<security:authorize access="hasPermission(#shop,'see')"></security:authorize>

在控制器和任何服务方法中,您可以使用:

@PreAuthorize("hasPermission(#shop,'see')")

就像这样:

代码语言:javascript
复制
@PreAuthorize("hasPermission(#shop,'see')")
@RequestMapping("/someUrl")
public String processSomeUrl(@ModelAttribute("shop") Shop shop){
    shop.getStuff();
}

或者@PostAuthorize@PostFilter("hasPermission(filterObject,'see')") (过滤列表)

所有这些函数都将根据您自己的权限评估器限制访问或筛选结果列表。它们都指向相同的实现,如下所示:

代码语言:javascript
复制
@Component
public class MyPermissionEvaluator implements PermissionEvaluator {

    private final Log logger = LogFactory.getLog(getClass());

    @Override
    public boolean hasPermission(Authentication auth, Object arg1, Object arg2) {
        logger.info("hasPermission "+auth+" - "+arg1+" - "+arg2+" ");
        if(arg2 instanceof String && arg1 instanceof Shop){
            Shop shop = (Shop)arg1;
            if(((String) arg2).equals("see")){
                //here you can have your own function
                boolean result = hasPermissionSeeShop(auth, project);                   
                return result;
            }
        }
        return false;
    }

    @Override
    public boolean hasPermission(Authentication arg0, Serializable arg1,
        String arg2, Object arg3) {
        logger.info("hasPermission "+arg0+" - "+arg1+" - "+arg2+" - "+arg3+" ");
        return false;
    }
}

此外,当这些方法返回false时,它会自动抛出一个AccessDeniedException,您可以很容易地将其配置为重定向到http元素中的自己的accessDenied页面:

代码语言:javascript
复制
<http auto-config="true">
    <intercept-url pattern="/admin*" access="ROLE_ADMIN" />
    <access-denied-handler error-page="accessDeniedPage"/>
</http>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13922706

复制
相关文章

相似问题

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