对 HttpServletRequest 中的角色进行不区分大小写的检查

Posted

技术标签:

【中文标题】对 HttpServletRequest 中的角色进行不区分大小写的检查【英文标题】:Case insensitive check for role in HttpServletRequest 【发布时间】:2016-03-15 02:38:24 【问题描述】:

javax.servlet.http.HttpServletRequest 类有一个名为isUserInRole 的方法。例如,我使用它来检查用户是否具有admin 角色。但是,该方法区分大小写。因此,如果请求中的角色是AdminADMIN,那么isUserInRole("admin") 将是错误的。我在多个应用程序的许多地方使用isUserInRole 方法来检查许多不同的角色。

有没有一种方法可以不区分大小写地实现isUserInRole 功能,而不需要使用isUserInRole 检查每个不同的可能大小写组合?

【问题讨论】:

为什么?您在拼写角色名称时遇到问题? 我在不同的环境中使用了多个版本的第三方身份验证服务,其中一个是小写的角色名称,而另一个保留大小写。 【参考方案1】:

您可以使用HttpServletRequestWrapper 实现包装请求的过滤器 - 实现您的 HttpServletRequestWrapper 以覆盖 isUserInRole() 方法以使其不区分大小写(例如,将所有角色配置为大写,通过转换为来测试角色参数大写)。

快速搜索会发现大量 HTTPServletRequestWrapper 示例...

【讨论】:

【参考方案2】:

http://docs.oracle.com/javaee/6/tutorial/doc/gjiie.html

只需将多个角色名称映射到管理员角色:

<servlet>
    <security-role-ref>
        <role-name>admin</role-name>
        <role-link>admin</role-link>
    </security-role-ref>
    <security-role-ref>
        <role-name>Admin</role-name>
        <role-link>admin</role-link>
    </security-role-ref>
</servlet>

<security-role>
    <role-name>admin</role-name>
</security-role>

【讨论】:

isUserInRole的调用用于根据角色在rest端点上执行不同的代码路径。我们已经在 web.xml 中设置了这种访问限制。

以上是关于对 HttpServletRequest 中的角色进行不区分大小写的检查的主要内容,如果未能解决你的问题,请参考以下文章

对HttpServletRequest中的Header进行增删

Servlet中的HttpServletRequest接口

继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数

JavaWeb-Servlet笔记--- Servlet规范;Servlet接口实现类;Servlet对象生命周期;HttpServletResponse/HttpServletRequest;请求对

HttpServletRequest 对文件上传的支持

HttpServletRequest 中的 getRequestURI 和 getPathInfo 方法有啥区别?