Ada*_*Lee 2 java security jsp authorization servlets
我们想根据Tomcat中的用户登录隐藏一些代码功能.我们正在使用基本身份验证.有什么建议?
如果你的意思是隐藏一些资源,这取决于用户是否登录,那么这只是限制访问某些页面的问题(参见下面的参考资料).
如果要根据登录的用户隐藏某些功能,则其中一个解决方案是在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>
Run Code Online (Sandbox Code Playgroud)
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等)的一部分维护的,因此可以在必要时使用参数调用非getter方法.
根据用户角色隐藏/限制对某些页面的访问的另一种方法是在web.xml中进行安全性配置,或使用注释(最低Java EE 5),或者创建自己的过滤器来检查用户的角色请求.
要创建自己的Filter,请创建一个实现javax.servlet.Filter接口的类,并在doFilter()方法中使用HttpServletRequest方法isUserInRole()检查发出请求的用户的角色.
下面是一个实现自定义Filter的简单示例:
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() {}
}
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
当然,在您的情况下,考虑到您使用基本身份验证的事实,在web.xml(声明性安全性)中使用安全配置或使用编程安全性要容易得多.
从官方Java EE文档中引用:
可以通过以下方式为Web应用程序实现Java EE安全服务:
元数据注释(或简称注释)用于指定类文件中的安全性信息.部署应用程序时,此信息可由应用程序部署描述符使用或由其覆盖.
声明性安全性表示应用程序的安全性结构,包括部署描述符中的安全角色,访问控制和身份验证要求,该部署描述符位于应用程序外部.
部署描述符中显式指定的任何值都会覆盖注释中指定的任何值.程序化安全性嵌入在应用程序中,用于做出安全决策.当声明性安全性不足以表达应用程序的安全模型时,编程安全性很有用.
查看与保护Java EE应用程序相关的官方Java EE文档(在您的情况下请注意指定授权约束部分):
Java EE 6:保护Web应用程序
Java EE 5:保护Web应用程序的安全
还可以查看官方文档中的示例:
Java EE 6.示例:保护Web应用程序
Java EE 5.示例:保护Web应用程序
| 归档时间: |
|
| 查看次数: |
5683 次 |
| 最近记录: |