如何根据用户登录隐藏某些功能?

时间:2013-01-15 22:41:30

标签: java jsp security servlets authorization

我们希望根据Tomcat中的用户登录隐藏一些代码功能。我们正在使用基本身份验证。有什么建议吗?

1 个答案:

答案 0 :(得分:8)

IF 您的意思是隐藏一些资源,具体取决于用户是否登录,这只是限制对某些网页的访问权限(请参阅以下参考资料)。

IF 您希望隐藏基于登录的人的某些功能,然后其中一个解决方案就是在JSP中检查用户角色并输出内容因此。

原始例子:
sample.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
    <title>Sample Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <c:choose>
        <c:when test="${pageContext.request.isUserInRole('admin')}">
            <p>Content for admin.<p>
        </c:when>
        <c:when test=${pageContext.request.isUserInRole('someRole')}">
            <p>Some content here</p>
        <c:when>
        <c:otherwise>
            <p>Another Content</p>
        </c:otherwise>
    </c:choose>
</body>
</html>

<强> NB!
为了能够使用EL调用带参数的方法,您必须使用最小的 Servlet版本3 从这里引用:https://stackoverflow.com/tags/el/info

  

从EL 2.2开始,它作为Servlet 3.0 / JSP 2.2的一部分进行维护   (Tomcat 7,Glassfish 3,JBoss AS 6等),它可以调用   非必要的方法,必要时带参数。


根据用户角色隐藏/限制对某些网页的访问的另一种方法是在 web.xml 中进行安全配置,或使用注释(最小Java) EE 5),或者创建自己的过滤器,用于检查发出请求的用户的角色。

要创建自己的过滤器,请创建一个实现 javax.servlet.Filter 界面的类,并使用 doFilter() 方法使用HttpServletRequest方法 isUserInRole() 检查发出请求的用户的角色。

以下是实现自定义过滤器的简单示例:
RoleCheckFilter.java

package com.example.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet Filter implementation class RoleCheckFilter.
 * Its purpose is to check logged-in user's role and
 * and accordingly allow or prevent access to the web resources.
 */
public class RoleCheckFilter implements Filter {

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig filterConfig) throws ServletException {}

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (request.isUserInRole("admin")) {
            // user have the appropriate rights, allow the request
            chain.doFilter(request, response);
        } else {
            // user does not have the appropriate rights, do something about it
            request.setAttribute("error", "You don't have enough rights to access this resource");
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            // or you could forward a user request somewhere
        }
    }


    /**
     * @see Filter#destroy()
     */
    public void destroy() {}

}

web.xml 中添加适当的过滤器配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    ...

    <filter>
        <filter-name>Role Check Filter</filter-name>
        <filter-class>com.example.filter.RoleCheckFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Role Check Filter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    ...

</web-app>

当然在您的情况下,考虑到您使用基本身份验证这一事实,在 web.xml中更容易进行安全配置声明性安全性)或使用程序化安全性

引自官方Java EE文档:

  

可以为Web应用程序实现Java EE安全服务   以下方式:

     
      
  • 元数据注释(或简称为注释)用于指定有关类文件中安全性的信息。部署应用程序时,此信息可由应用程序部署描述符使用或覆盖。

  •   
  • 声明性安全性表示应用程序外部的部署描述符中的应用程序安全结构,包括安全角色,访问控制和身份验证要求。
      部署描述符中显式指定的任何值都将覆盖注释中指定的任何值。

  •   
  • 程序化安全性嵌入在应用程序中,用于做出安全决策。当声明性安全性不足以表达应用程序的安全模型时,编程安全性很有用。

  •   

查看与保护Java EE应用程序相关的官方Java EE文档(在您的情况下,请注意指定授权约束部分):
Java EE 6: Securing Web Applications
Java EE 5: Securing Web Applications

还可以查看官方文档中的示例:
Java EE 6. Examples: Securing Web Applications
Java EE 5. Examples: Securing Web Applications