从零开始手写Tomcat的教程10节---安全性
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始手写Tomcat的教程10节---安全性相关的知识,希望对你有一定的参考价值。
从零开始手写Tomcat的教程10节---安全性
领域
目前可知结构,如图所示,下面继续分析
GenericPrincipal类
LoginConfig类
Authenticator接口
在Tomcat中的*Base类基本都是实现了接口中大部分方法的基础类,将会有不同实现需求的少量方法设置为抽象方法,让不同的子类实现,大家可以学习这种设计思想、
BasicAuthenticator的authenticate方法
public boolean authenticate(HttpRequest request,
HttpResponse response,
LoginConfig config)
throws IOException
// Have we already authenticated someone?
Principal principal =
((HttpServletRequest) request.getRequest()).getUserPrincipal();
if (principal != null)
if (debug >= 1)
log("Already authenticated '" + principal.getName() + "'");
return (true);
// Validate any credentials already included with this request
HttpServletRequest hreq =
(HttpServletRequest) request.getRequest();
HttpServletResponse hres =
(HttpServletResponse) response.getResponse();
String authorization = request.getAuthorization();
String username = parseUsername(authorization);
String password = parsePassword(authorization);
principal = context.getRealm().authenticate(username, password);
if (principal != null)
register(request, response, principal, Constants.BASIC_METHOD,
username, password);
return (true);
// Send an "unauthorized" response and an appropriate challenge
String realmName = config.getRealmName();
if (realmName == null)
realmName = hreq.getServerName() + ":" + hreq.getServerPort();
// if (debug >= 1)
// log("Challenging for realm '" + realmName + "'");
hres.setHeader("WWW-Authenticate",
"Basic realm=\\"" + realmName + "\\"");
hres.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
// hres.flushBuffer();
return (false);
安装验证器阀
应用程序
SimpleContextConfig类
SimpleRealm类
SimpleUserDataBaseRealm类
Bootstarp1类
BootStrap2类
总结
- Principal主要是为了对用户的一些属性进行封装,所以也被称为主体对象,这里主体指的是用户,主要封装了用户姓名,密码,用户角色,当前关联的领域对象realm
- realm主要负责完成认证功能,然后tomcat中一个Context容器关联一个Realm对象,并且不同的realm子类实现,通过不同的方式来加载有效用户信息,在authenticate方法中,对传入用户名密码进行验证,然后生成一个 Principal对象返回
- AuthenticatorBase类主要按照实现的认证方式不同,采取不同的认证流程,但是对用户信息校验,都是调用realm的认证方法完成的,这也算是一种解耦,因为用户信息的读取有多种不同的方式
从tomcat的设计中,我们还可以思考一下rcpc权限管理框架设计的一种思想:
由于本人其实对于tomcat的安全这块没有做深入了解,上面写的内容可能会有偏差,包括个人的理解方面,可能也会有问题,但是我这里更想介绍的是tomcat中权限与安全管理给我的一种启发和思考
以上是关于从零开始手写Tomcat的教程10节---安全性的主要内容,如果未能解决你的问题,请参考以下文章
从零开始手写Tomcat的教程12节----StandardContext