<web-app>
<security-constraint>
<web-resource-collection>
<web-resource-name>myweb</web-resource-name>
<description>my web description</description>
<url-pattern>/</url-pattern>
<url-pattern>/xxx/*</url-pattern>
<http-method>GET</http-method>
<http-method>PUT</http-method>
<http-method>HEAD</http-method>
<http-method>TRACE</http-method>
<http-method>POST</http-method>
<http-method>DELETE</http-method>
<http-method>OPTIONS</http-method>
</web-resource-collection>
<auth-constraint>
<description></description>
<role-name>SomeSimpleRole</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>
CONFIDENTIAL
</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>XXX</realm-name>
</login-config>
<security-role>
<role-name>SomeSimpleRole</role-name>
</security-role>
</web-app>
web-resource-collectio 指定哪些URL被保护,用户通过在auth-constraint定义角色,只有在auth-constraint下定义的角色可以访问这些URL
login-config对整个应用程序指定身份验证。JBoss提供四种身份验证策略,分别是BASIC,FORM,DEGEST,CLENT-CRET。
- BASIC 该选项使用HTTP基本身份验证,这种身份验证方法使浏览器弹出一个提示用户输入密码的模式对话框。
BASIC方式浏览器常常会保存用户名和密码,但是不提示用户,这种方式难以对应用程序启用注销功能。与页面风格不一致所以大型程序很少用。
- FORM 基于表单的身份验证与基本身份验证相似,但是带有一个登陆表单的HTML页面被发送到浏览器以便用户进行登录时使用
<form name="loginForm" method="post" action="j_security_check"> <input type="text" name="j_username"/><br /> <input type="password" name="j_password" /> <br /> <input type="submit"/> </form>
表单动作必须包含j_security_check值,以及用户名和密码框name分别为j_username和j_password
login-config配置
<login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.html</form-login-page> <form-error-page>/error.html</from-error-page> </form-login-config> </login-config>
- CLIENT-CERT 如果用户有一个公钥证书,服务器使用这种策略验证证书
- DIGEST这种身份验证机制使浏览器以与基本身份验证相同的方式显示对话框,但是密码在被发送到服务器前散列在包含其他信息的摘要中
注:BASIC和FORM身份验证是最常用的身份验证策略,但是对HTTP使用这些身份验证方法存在两个问题,一.不能确定服务器源的完整性,二.未对发送的密码进行加密处理,用户密码易被拦截。可以通过使用HTTPS协议来解决。
realm-name指定请求一个安全URL是发送到客户端的说明性文字,一般浏览器会在登录对话框上显示realm-name的值.
user-data-constraint用于指定进入应用程序的请求是否必须被加密,transport-guarantee元素可以是CONFIDENTIAL、INTEGRAL和NONE。CONFIDENTIAL的设置意味着指定应用程序要求数据进行传输防止其他实体观察传输的内容。INTEGRAL的设置意味着在客户端和服务器间发送的数据不能在传输中被更改。如果传输保证设置为CONFIDENTIAL或INTEGRAL,那么security-constraint模块中的不安全请求将重定向到安全的连接器中(使用SSL),NONE与不设置一样。
web.xml用来定义哪些URL应该被保护,并未说明如何被保护。这是安全域应该做的工作,安全域配置在login-config.xml,并且是应用程序在jboss-web.xml文件中指向的对象。
2.jboss-web.xml
假设有一个定义在login-config.xml文件中的安全域
<application-policy name="some-domain"></application-policy>
一下jboss-web说明如何指向该安全域
<jboss-web>
<security-domain>java:/jaas/some-domain</security-domain>
</jboss-web>
当安全框架读取login-config.xml文件时会创建一个安全域并绑定在java:/jass/some-domain下的JNDI上。jboss-web.xml上文件的作用只是将应用程序映射到安全域
3.sever.xml
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" keystoreFile="/x.keystore" keystorePass="rmi+ssl" sslProtocol="TLS" />
如何启用该连接器配置并将其指向包含服务器证书的密钥库,那么客户端就可以通过SSL在服务器上访问web页面。
<Realm className="org.jboss.web.tomcat.security.JBossSecurityMgrRealm"
certificatePrincipal="org.jboss.security.auth.certs.SubjectDNMapping"
allRolesMode="authOnly"
/>
certificatePrincipal属性用于客户端证书验证。
4.logout
将session设为无效即可logout,jboss有session listener 会将缓存的用户信息清除。