<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.Filter;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.FilterChain;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.FilterConfig;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletException;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletRequest;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletResponse;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.annotation.WebFilter;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpServletRequest;
@WebFilter("/*"<span style="color: #000000;">)
<span style="color: #0000ff;">public <span style="color: #0000ff;">class MyFilter <span style="color: #0000ff;">implements<span style="color: #000000;"> Filter {
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> init(FilterConfig filterConfig) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> ServletException {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO 自动生成的方法存根</span>
System.setProperty("java.security.auth.login.config"<span style="color: #000000;">,Thread.currentThread().getContextClassLoader().getResource(</span>"jaas.config"<span style="color: #000000;">).getPath());
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
</span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException,ServletException {
chain.doFilter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MyRequest((HttpServletRequest) request),response);
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> destroy() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO 自动生成的方法存根</span>
<span style="color: #000000;">
}
}
用于登录的login.html:
Insert title here
<<UserName<<
<<Password<<
<<<
MyLoginModule实现:其中的三个name属性必须是固定值:、和。
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.Subject;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.callback.Callback;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.callback.CallbackHandler;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.callback.NameCallback;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.callback.PasswordCallback;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.callback.UnsupportedCallbackException;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.login.LoginException;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.security.auth.spi.LoginModule;
<span style="color: #0000ff;">public <span style="color: #0000ff;">class MyLoginModule <span style="color: #0000ff;">implements<span style="color: #000000;"> LoginModule {
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> CallbackHandler handler;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Subject subject;
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> initialize(Subject subject,CallbackHandler callbackHandler,Map<String,?><span style="color: #000000;"> sharedState,Map</span><String,?><span style="color: #000000;"> options) {
handler </span>=<span style="color: #000000;"> callbackHandler;
</span><span style="color: #0000ff;">this</span>.subject =<span style="color: #000000;"> subject;
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> login() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> LoginException {
Callback[] callbacks </span>= <span style="color: #0000ff;">new</span> Callback[2<span style="color: #000000;">];
callbacks[</span>0] = <span style="color: #0000ff;">new</span> NameCallback("login"<span style="color: #000000;">);
callbacks[</span>1] = <span style="color: #0000ff;">new</span> PasswordCallback("password",<span style="color: #0000ff;">true</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
handler.handle(callbacks);
String name </span>= ((NameCallback) callbacks[0<span style="color: #000000;">]).getName();
String password </span>= String.valueOf(((PasswordCallback) callbacks[1<span style="color: #000000;">]).getPassword());
</span><span style="color: #0000ff;">if</span> (name != <span style="color: #0000ff;">null</span> && name.equals("user123") && password != <span style="color: #0000ff;">null</span> && password.equals("pass123"<span style="color: #000000;">)) {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> If credentials are NOT OK we throw a LoginException</span>
<span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> LoginException("Authentication failed"<span style="color: #000000;">);
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e) {
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> LoginException(e.getMessage());
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (UnsupportedCallbackException e) {
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> LoginException(e.getMessage());
}
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> commit() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> LoginException {
subject.getPrincipals().add(</span><span style="color: #0000ff;">new</span> UserPrincipal("user123"<span style="color: #000000;">));
subject.getPrincipals().add(</span><span style="color: #0000ff;">new</span> RolePrincipal("admin"<span style="color: #000000;">));
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> abort() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> LoginException {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO 自动生成的方法存根</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> logout() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> LoginException {
subject.getPrincipals().clear();
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
}
在.NET的RBS基础上实现RBAC(参考4)是可行的,但JAAS....。JAAS只要用过的人都对其印象。
4.参考
(1)https://msdn.microsoft.com/en-us/library/52kd59t0(v=vs.90).aspx
(2)http://docs.oracle.com/javase/8/docs/technotes/guides/security/jaas/JAASRefGuide.html
(3)http://www.byteslounge.com/tutorials/jaas-form-based-authentication-in-tomcat-example
(4)http://csrc.nist.gov/groups/SNS/rbac/
5.小结:
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!