java web容器_Java Web容器安全
這里的Java Web容器特指Tomcat,Tomcat依然是最流行的Java Web容器,你大爺還是你大爺。
本文并不涉及業務層面上的安全控制,只針對Tomcat自身所支持的相關安全控制功能與特性。
首先看一下Web容器的四個基本安全特性驗證 Authentication
資源訪問控制 Access control for resources
數據完整性 Data Integrity
數據機密性或私密性 Confidentiality or Data Privacy
每一項的細節這里不展開,并不難理解。
Java EE使用基于角色的訪問控制——有用戶、組、角色三個基本概念。
存儲用戶名和密碼的地方叫Realm,有可能是文件,比如Tomcat的tomcat-users.xml,也可能是數據庫,或者基于證書的機制。
Tomcat支持聲明式驗證和編程式驗證,一個是基于XML配置,一個是通過代碼實現。
聲明式基本身份驗證
在web.xml中定義
BASIC
同時可以定義角色
Admin User
admin
Manager
manager
針對路徑做控制
Admin
/admin/*
admin
連HTTP方法也能配置
Manager
/manager/*
GET
POST
admin
manager
部署后,根據各服務器來配置用戶和角色,比如Tomcat的就在conf/tomcat-users.xml里。
Tomcat的驗證過程如下初次訪問某個受保護的URI,Web容器會檢查請求中是否包括Authorization頭,如果沒有,容器會返回401,以及WWW-Authenticate標頭給瀏覽器,瀏覽器收到后會彈出對話框要求用戶輸入名稱和密碼。
如果用戶輸入用戶名、密碼正確后,瀏覽器會將用戶名、密碼以BASE64方式編碼,然后放在Authorization標頭中送出,容器進行驗證,正確就將資源傳回。
在關閉瀏覽器之前,對服務器的請求都包括Authorization頭,服務器也每次都檢查,所以登錄有效期一直持續到關閉瀏覽器為止。
現在實驗步驟如下
在Tomcat9目錄下,修改conf/tomcat-users.xml文件,解注并新增admin的角色
在webapps目錄下,新建test目錄和/WEB-INF/web.xml文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
?
Servlet and JSP Examples.
Servlet and JSP Examples
?
UTF-8
?
Example Security Constraint
Protected Area - Allow methods
/admin/*
DELETE
GET
POST
PUT
admin
manager
BASIC
?
admin
manager
新建/admin目錄和/test.html文件,
輸入正確后,查看請求可以看到Authorization頭
注意這種方式幾乎跟裸奔沒區別,只要能攔截到你的HTTP請求,就相當于查看到你的密碼。上面Basic后的字符串用base64解密就是tomcat:123456。
如果需要自定義登錄窗口,可以配置
FORM
/login.html
/error.html
登錄表單的action和name屬性是有要求的
除了FORM和BASIC,還可以設置為DIGEST或CLIENT_CERT。DIGEST提交時傳遞的是MD5加密后的摘要,CLIENT_CERT使用的是Public Key Certificate(PKC)加密,客戶端要安裝證書。
如果要啟用HTTPS,則在下設置
CONFIDENTIAL
默認值是NONE,還可以設置為INTEGRAL,不過習慣設為CONFIDENTIAL,效果一樣。
設置完后,認證的時候會自動跳轉為HTTPS
編程式安全管理
支持編程能帶來更靈活的控制。HttpServletRequest里跟安全有關的方法有authenticate( ): 是否登錄,如果沒有,返回false,并會轉到登錄界面
login( ): 登入
logout( ): 登出
getUserPrincipal( ): 取得代表用戶的Principal對象
getRemoteUser( ): 獲得登錄用戶的名稱
isUserInRole(String role): 傳入角色名稱,檢查登錄用戶是否屬于該角色
@WebServlet("/secret")
public class User extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (request.authenticated(response)) { // 檢查登錄 // 執行登錄后的用戶能夠做的事情 }
}
@WebServlet("/login")
public class Login extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("user");
String password = request.getParameter("passwd");
try {
request.login(username, password);
response.sendRedirect("user");
} catch( ServletException ex) {
response.sendRedirect("login.html");
}
}
和對標的注解是@ServletSecurity,比如
@WebServlet("/admin")
@ServletSecurity(@HttpConstraint(rolesAllowed = {"admin"}))
就表示/admin只允許admin角色訪問。
再看一個復雜一點的
@WebServlet("/admin")
@ServletSecurity(
value=@HttpConstraint(rolesAllowed = { "admin", "manager" }),
httpMethodConstraints = {
@HttpMethodConstraint(value = "GET", rolesAllowed = {"admin", "manager"},
transportGuarantee = TransportGuarantee.CONFIDENTIAL),
@HttpMethodConstraint(value = "POST", rolesAllowed = {"admin", "manager"}),
)
其它Realm
前面的例子都是把用戶名密碼放在配置文件里,這樣帶來一定的隱患,在Tomcat里也支持其它的Realm,比如JDBCRealm
DataSourceRealm
JNDIRealm
UserDatabaseRealm
MemoryRealm
JAASRealm
CombinedRealm
LockOutRealm
總結
以上是生活随笔為你收集整理的java web容器_Java Web容器安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java合并list_怎么把两个list
- 下一篇: java美元兑换,(Java实现) 美元