tomcat 安全认证 Realm 及 多种类型 Realm 配置

Tomcat 容器的安全认证和鉴权 大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持: 身份验证:验证授权用户的用户名和密码 资源访问控制:限制某些资源只允许部分用户访问 数据完整性:能够证明数据在传输过程中未被第三方修改 机密性或数据隐私:传输加密(SSL),确保信息只能被信任用户访问 本文就以上问题,对 Tomcat 容器提供... 阅读详情

web.xml 安全配置

Servlet规范支持安全地访问 web 资源,只需要通过 web.xml 简单配置即可,其功能由服务器提供商实现,

web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>some name</web-resource-name>

            <url-pattern>*.jsp</url-pattern>
            <url-pattern>*.do</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>
            <role-name>tomcat</role-name>
            <role-name>admin</role-name>
        </auth-constraint>

        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
            <!--
                这个可选的元素指出在访问相关资源时使用任何传输层保护。
                它必须包含一个transport-guarantee子元素(合法值为NONE、INTEGRAL或CONFIDENTIAL),
                transport-guarantee为NONE值将对所用的通讯协议不加限制。
                INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。
                虽然原理上(并且在未来的HTTP版本中),在INTEGRAL和CONFIDENTIAL之间可能会有差别,
                但在当前实践中,他们都只是简单地要求用SSL。
            -->
        </user-data-constraint>

    </security-constraint>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>admin page</web-resource-name>
            <url-pattern>/admin.jsp</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>tomcat page</web-resource-name>
            <url-pattern>/tomcat.jsp</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>tomcat</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <!--<auth-method>BASIC</auth-method>-->

        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.html</form-login-page>
            <form-error-page>/error.html</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <role-name>tomcat</role-name>
    </security-role>
    <security-role>
        <role-name>admin</role-name>
    </security-role>

</web-app>

其内容表示:

安全规则:admin.jsp 只能由 admin 角色访问,tomcat.jsp 只能由 tomcat 角色访问,其它任意 *.jsp  *.do 可由 admin 或 tomcat 角色访问。

认证方式:BASIC 是基础认证方式,由浏览器厂商实现的用户名和密码接收界面;FORM 是应用定制的用户名和密码接收页面;

角色声明:必需声明出所有用到的角色


tomcat 用户和角色配置

在tomcat的conf目录下找到 tomcat-users.xml,添加以下内容:
  <role rolename="tomcat"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="both" roles="tomcat,admin"/>
  <user username="admin" password="admin" roles="admin"/>


Realm配置

tomcat支持多种Realm:
JDBCRealm
DataSourceRealm
JNDIRealm
UserDatabaseRealm
MemoryRealm
JAASRealm
CombinedRealm
LockOutRealm
每种不同的 Realm 采用了不同的 用户名和密码存储和使用方式,tomcat默认使用的是 UserDatabaseRealm。

JDBCRealm

这个 Realm 是基于数据库的,数据库保存了 用户名/密码和用户的角色,通过建立数据库的通信来维持用户角色信息
1.所需要的数据库脚本
create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);

insert into users ( user_name , user_pass ) values ( 'admin','admin')
insert into users ( user_name , user_pass ) values ( 'tomcat','admin')
insert into user_roles values ( 'admin','admin')
insert into user_roles values ( 'tomcat','tomcat')

2.修改tomcat server.xml 添加安全域配置:
<Realm className="org.apache.catalina.realm.JDBCRealm"
   driverName="org.h2.Driver"
   connectionURL="jdbc:h2:tcp://localhost//home/conquer/mine/work_space/h2-dbpath/tomcat"
   connectionName="sa"
   connectionPassword=""
   userTable="users" userNameCol="user_name" userCredCol="user_pass"
   userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>


DataSourceRealm

这个安全域和上面的JDBCRealm实现基本一致,只不过不是创建数据库连接,而是从jndi上下文获取数据源,它所需要的数据库脚本和JDBCRealm一致。
修改tomcat server.xml 添加安全域配置:
1.在 GlobalNamingResources 节点下添加:
<Resource 
  name="jdbc/h2"
  type="javax.sql.DataSource"
  username="sa"
  password=""
  driverClassName="org.h2.Driver"
  url="jdbc:h2:tcp://localhost//home/conquer/mine/work_space/h2-dbpath/tomcat"/>
2.继续添加安全域配置(这里会使用jndi引用上面注册的数据源资源):
<Realm className="org.apache.catalina.realm.DataSourceRealm"
   dataSourceName="jdbc/h2"
   userTable="users" userNameCol="user_name" userCredCol="user_pass"
   userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>

MemoryRealm

这个是最简单的的配置,默认是读取 tomcat-users.xml (可通过pathname属性配置为其它文件)里面配置的用户角色信息。
修改server.xml 添加配置:
<Realm className="org.apache.catalina.realm.MemoryRealm"/>


UserDatabaseRealm

这个是基于上述 MemoryRealm 扩展出来的,默认也是读取tomcat-users.xml (可通过pathname属性配置为其它文件)里面配置的用户角色信息,
不过他是通过应用jndi的方式实现的,从设计上支持多种实现方式,默认采用了类似MemoryRealm的实现方式,但是又对其进行了扩展,主要是增加了 “用户组”的概念,即用户除了有所属角色外,还可以有所属 “用户组”,,用户组可以关联其它多个角色,例如它可以使用下面的tomcat-users.xml配置:
  <role rolename="tomcat"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <group groupname="one" roles="tomcat"/>
  <user username="admin" password="admin" roles="admin" groups="one"/>

admin用户由于关联了 “one”这个用户组,“one”用户组包含角色“tomcat”,所以 admin用户就拥有了“tomcat”角色。

这个安全域的配置:
1. sever.xml 的 GlobalNamingResources 节点下添加:
<Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />

2.启用该安全域的配置:
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>

JAASRealm

这个是基于java的 jaas 认证和授权服务而设计的,主要就是用到了 jaas的认证部分,不涉及“授权”,通过向 javax.security.auth.Subject#getPrincipals()

里面添加用户和角色来完成用户和角色的认证,注意这里的技巧在于,tomcat要在server.xml的该安全域里配置哪些java类型的 Principal 表示用户,哪些java类型的Principal表示角色,因为jaas的登录模块在验证成功后只能将用户和角色信息都放入到javax.security.auth.Subject#getPrincipals(),通过事先的类型约定来让tomcat识别用户和角色信息。

这个安全域的配置如下:
<Realm className="org.apache.catalina.realm.JAASRealm"
                appName="Sample"
			    userClassNames="jaas.SamplePrincipal"
			    roleClassNames="jaas.SampleRolePrincipal"/>

可以看到,上面的配置中指定了jaas.SamplePrincipal表示用户,而jaas.SampleRolePrincipal表示角色。
可以通过 confiFile 属性来配置 jaas 需要的认证配置文件,或者使用java默认 -Djava.security.auth.login.config=xx/jaas.config 参数来指定。
关于jaas的登录模块的实现,请看: Java认证和授权服务 JAAS 之 认证 http://blog.youkuaiyun.com/conquer0715/article/details/78204889
和 Java认证和授权服务 JAAS 之 授权 http://blog.youkuaiyun.com/conquer0715/article/details/78205755

注意:如果要使用 Java认证和授权服务 JAAS 之 认证中的例子,需要进行如下更改:

1. MyLoginModule 文件:
package jaas;

import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.FailedLoginException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import java.security.Principal;
import java.util.Map;

public class MyLoginModule implements LoginModule {

    // username and password
    private String username;
    private char[] password;

    // the authentication status
    private boolean userPwdSucceeded = false;
    private boolean commitSucceeded = false;

    // user's Principal
    private Principal userPrincipal;


    // initial state
    private Subject subject;
    private CallbackHandler callbackHandler;


    /**
     * Initialize this <code>LoginModule</code>.
     */
    public void initialize(Subject subject,
                           CallbackHandler callbackHandler,
                           Map<java.lang.String, ?> sharedState,
                           Map<java.lang.String, ?> options) {

        this.subject = subject;
        this.callbackHandler = callbackHandler;
    }

    /**
     * Authenticate the user by prompting for a user name and password.
     */
    public boolean login() throws LoginException {
        // prompt for a user name and password
        if (callbackHandler == null)
            throw new LoginException("Error: no CallbackHandler available " +
                    "to garner authentication information from the user");

        Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback("user name");
        callbacks[1] = new PasswordCallback("password", false);
//        callbacks[2] = new TextOutputCallback(TextOutputCallback.INFORMATION, "hello, just a msg!");
//        callbacks[3] = new TextOutputCallback(TextOutputCallback.WARNING, "just warn you!");

        try {
            callbackHandler.handle(callbacks);
            NameCallback nameCallback = (NameCallback) callbacks[0];
            PasswordCallback passwordCallback = (PasswordCallback) callbacks[1];

            username = nameCallback.getName();

            char[] tmpPassword = passwordCallback.getPassword();
            passwordCallback.clearPassword();// clean password in memory space
            if (tmpPassword == null) {
                tmpPassword = new char[0];// treat a NULL password as an empty password
            }
            password = new char[tmpPassword.length];
            System.arraycopy(tmpPassword, 0, password, 0, tmpPassword.length);
        } catch (Exception e) {
            e.printStackTrace();
        }


        // verify the username/password
//        boolean usernameCorrect = false;
//        if (username.equals("user")) usernameCorrect = true;
//
//        if (usernameCorrect &&
//                password.length == 3 &&
//                password[0] == 'p' &&
//                password[1] == 'w' &&
//                password[2] == 'd') {
//
//            userPwdSucceeded = true;
//        } else {
//            userPwdSucceeded = false;
//            cleanUserAndPwdData();
//            if (!usernameCorrect) {
//                throw new FailedLoginException("User Name Incorrect");
//            } else {
//                throw new FailedLoginException("Password Incorrect");
//            }
//        }
//        return userPwdSucceeded;
        userPwdSucceeded=true;
        return true;
    }

    public boolean commit() throws LoginException {
        if (!userPwdSucceeded) return false;

        // add a Principal (authenticated identity) to the Subject
        userPrincipal = new SamplePrincipal(username);
        subject.getPrincipals().add(userPrincipal);
        // for tomcat jaas realm
        if (username.equals("admin")) {
            subject.getPrincipals().add(new SampleRolePrincipal("admin"));
        } else if (username.equals("tomcat")) {
            subject.getPrincipals().add(new SampleRolePrincipal("tomcat"));
        }

        // in any case, clean out state
        cleanUserAndPwdData();

        return commitSucceeded = true;
    }

    public boolean abort() throws LoginException {
        if (!userPwdSucceeded) return false;

        if (commitSucceeded) {
            logout();
        } else {
            cleanState();
        }

        return true;
    }

    public boolean logout() throws LoginException {
        subject.getPrincipals().remove(userPrincipal);
        cleanState();
        userPwdSucceeded = commitSucceeded;
        return true;
    }

    private void cleanState() {
        userPwdSucceeded = false;
        cleanUserAndPwdData();
        userPrincipal = null;
    }

    private void cleanUserAndPwdData() {
        username = null;
        if (password != null) {
            for (int i = 0; i < password.length; i++)
                password[i] = ' ';
            password = null;
        }
    }
}

SamplePrincipal 文件:

package jaas;

import java.security.Principal;

public class SamplePrincipal implements Principal {
    private String name;

    public SamplePrincipal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

SampleRolePrincipal文件:
package jaas;

public class SampleRolePrincipal extends SamplePrincipal {
    public SampleRolePrincipal(String name) {
        super(name);
    }
}


说明:
另外注意 userClassNames="jaas.SamplePrincipal" 和 roleClassNames="jaas.SampleRolePrincipal" 两个实现类的 equals 和 hascode 方法,如果覆盖不好最好不要覆盖,否则容易 subject.getPrincipals().add 不进去。

测试:

启动tomcat,部署web应用后,浏览器访问不同的jsp,可以看到安全规则已经生效:
admin.jsp 只能由 admin 角色访问,tomcat.jsp 只能由 tomcat 角色访问,其它任意 *.jsp  *.do 可由 admin 或 tomcat 角色访问。

Carsim2019与Simulink (Matlab2018b)联合仿真成功(超详细) Carsim与Simulink联合仿真成功 阅读详情

相关推荐

当AI换脸遇上内容审核:Facefusion NSFW检测的技术伦理与用户自主权之争

本文探讨了Facefusion开源AI换脸工具中NSFW检测机制的技术伦理困境与用户自主权之争。分析了其多层次防御机制的技术实现与社区规避方法,揭示了开源软件在安全与自由之间的平衡难题,并提出了分层权限设计等社区实践方案。

weixin_29165725的博客 694

Tomcat 6 —— Realm域管理

本篇来源于官方文档,但不仅仅是翻译,其中不乏网上搜索的资料与自己的理解。 如有错误,请予指正。 什么是Realm   首先说一下什么是Realm,可以把它理解成“域”,也可以理解成“组”,因为它类似 类Unix系统 中组的概念。   Realm域提供了一种用户密码与web应用的映射关系。   因为tomcat中可以同时部署多个应用,因此并不是每个管理者都有权限去访问...

xingoo 343

基于Codex平台构建AI技能:抖音爆款分析与带货视频生成实战

这次我们来看一个基于 Codex 平台构建 AI 技能(Skill)的实战项目。核心目标很直接:利用 AI 能力,自动化分析抖音平台的爆款内容,并生成可用于带货的视频。这听起来像是内容创作领域的“自动化流水线”,它解决的核心痛点是:人工分析爆款、撰写脚本、制作视频的效率瓶颈。 对于技术开发者和内容创作者而言,这个项目的价值在于将“内容策略分析”和“视频内容生成”两个环节通过 Codex 的 Skill 机制串联起来,形成一个可定制、可批量执行的自动化工作流。我们最关心的几个问题包括:这个方案的技术门槛高不高

weixin_29054399的博客 487

Tomcat容器管理安全的几种验证方式

https://my.oschina.net/itblog/blog/678845?fromerr=mnnjJA0O 摘要: 本文介绍如何使用容器(这里指tomcat)来进行安全管理。 当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,它们是: BASIC(基本验证):通过HTTP验证,需要提供base6

zzy7075的专栏 5327

物联网 Mixly-智能楼道灯

一、实验目的及要求 熟悉声音及人体红外传感器用法。 二、实验原理与内容 1.使用声音传感器实现声控灯功能。 2.使用人体红外传感器实现人体检测控制灯功能。 三、实验软硬件环境 硬件:Arduino、LED灯、声音传感器、人体红外传感器 软件:Mixly IDE 四、实验过程(实验步骤、记录、数据、分析) 核心代码截图 声控灯: 人体红外检测灯: 3.实验效果图: (1)、声控灯总线连接: (1)、声控灯声音大于一某个值时灯亮,经过2秒后灯灭: (3)、人体红外检测灯连接总线: (4)、人体红外

qq_43430810的博客 1917

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2734

tomcat对于web.xml的security-constraint使用的处理机制

一.知识点         web.xml中&lt;security-constraint&gt; 的子元素 &lt;http-method&gt; 是可选的,如果没有 &lt;http-method&gt; 元素,这表示将禁止所有 HTTP 方法访问相应的资源。         子元素 &lt;auth-constraint&gt; 需要和 &lt;login-config&gt; 相配...

wjxbj的博客 2062

Synopsys AXI VIP 从环境搭建到首个验证场景运行

本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。

weixin_29185493的博客 344

Web安全-Tomcat禁用Web服务器内置不安全请求方法

1. 背景说明 Web安全测试中,会要求屏蔽非必要的不安全Http请求方法。一般要求保留get和post,其他的方法一般屏蔽,比如:OPTIONS,DELETE等。 本文主要收集业务系统中,不同时期,我们框架的各版本的处理方案,都基于tomcat+spring各版本体系。 2. 解决思路 使用...

acooly 2620

华为OD机试 - 小火车最多人时所在园区站点(Java 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 996

第16课:动手实战中文句法依存分析

句法分析是自然语言处理(NLP)中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。主要包括两方面的内容:一是确定语言的语法体系,即对语言中合法句子的语法结构给予形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。 句法分析被用在很多场景中,比如搜索引擎用户日志分析和关键词识别,比如信息抽...

春华秋实 2437

Tomcat中的Realm

Realm其实就是一个存放用户名,密码及角色的一个“数据库”。 Tomcat中的Realm有下面几种,你也可以使用自己的Realm,只要实现org.apache.catalina.Realm就可以了。 JDBCRealm 授权信息存在关系数据库中, 通过JDBC驱动访问 数据库中必须至少有两张表,表示用户及角色 用户表必须至少有两个字段,用户名及密码 角色表必须至少有两个字段,用户

IOT之无线网络传输技术 6943

SAP_PP模块定额工艺路线简介

在 SAP PP(生产计划)模块中,定额工艺路线(Routing) 是生产制造流程中的核心主数据之一,用于定义制造一个产品所需的标准操作步骤。工艺路线详细描述了生产过程中的各个工序、使用的工作中心、标准作业时间、资源分配等信息,是进行生产计划、成本核算、排产控制、车间执行等功能的基础。

我小时候很黑的博客 766

Tomcat(42)Tomcat的Realm

在Tomcat中配置Realm是实现安全认证和授权的关键步骤。通过选择合适的Realm类型并正确配置,你可以确保只有授权用户可以访问应用程序的敏感资源。合理配置Realm是确保应用程序安全的重要措施。

qq_43012298的博客 627

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Gretty 安全认证实战:Jetty/Tomcat 安全域与单点登录(SSO)完整指南

Gretty 是一款强大的 Gradle 插件,专门用于在 Jetty 和 Tomcat 上快速运行 Web 应用。在本文中,你将学会如何通过 Gretty 安全认证机制,为你的 Web 应用配置 Jetty/Tomcat 安全域、HTTPS 加密访问以及单点登录(SSO),从零搭建一套生产可用的认证体系。作为新手也能轻松上手的 Gradle Web 开发工具,Gretty 内置了对安全域(Rea

gitblog_00512的博客 616

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Realm Configuration How-To

Tomcat Home The Apache Software Foundation Apache Tomcat 8 Version 8.5.54, Apr 3 2020 Links Docs Home FAQ User Comments User Guide 1) Introduction 2) Setup 3) First webapp 4) Deployer 5) Manager 6) H...

[Blog][Domain] programb.blog.youkuaiyun.com 821

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

tomcat realm

安全域是Tomcat服务器用来保护Web应用的资源的一种机制。在安全域中可以配置安全验证信息,即用户信息(包括用户名和口令)以及用户和角色的映射关系。每个用户可以拥有一个或多个角色,每个角色拥有不同的可以访问的Web资源。一个用户可以访问其拥有的所有角色对应的Web资源。 引入角色的原因:角色一方面代表一系列用户,另外一方面可以代表一系列权限,因此可以说是用户和权限的结合体。引入角色的概念主

frankytony1的博客 462

tomcat设置context不生效_Tomcat 容器的安全认证和鉴权

大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持:身份验证:验证授权用户的用户名和密码资源访问控制:限制某些资源只允许部分用户访问数据完整性:能够证明数据在传输过程中未被第三方修改机密性或数据隐私:传输加密(SSL),确保信息只能被信任用户访问本文就以上问题,对 Tomcat 容器提供的认证和鉴权的设计...

weixin_39828198的博客 232

由自己所想的安全认证框架到shrio的认识过程

我们只在tomcat容器中考虑中这个问题,首先要清楚认识安全认证框架的工作是认证用户,不同的用户有不同的角色,不同的角色就有不同的权限,比如普通用户只能听一首音乐的部分内容,而VIP客户则可以听完整。所以我们怎样设计一个权限认证框架呢? 首先我们知道在Servlet容器里面有一个过滤器接口,通过实现它就可以拦截用户的请求,然后做相应的处理再转发给对应的servlet,所以我们可以通过实现一个Fil...

weixin_42002747的博客 194

cppcheck 代码质量检查器详解:constVariable —— 让编译器替你守护数组的只读承诺

本文以 [constVariable.md](https://link.gitcode.com/i/9cd37922bb9c42300c416332bcb3f50f) 为核心,讲解 cppcheck 中一类典型的代码质量(Code Quality)风格检查:当局部数组变量在初始化之后只被读取、从未被写入时,cppcheck 会建议将其声明为 `const` 数组。你将学会识别这类告警的触发条件、理

gitblog_00707的博客 1025

深入剖析Tomcat之安全领域与用户认证实现

Tomcat安全领域与用户认证机制解析 本文深入探讨了Tomcat的安全认证机制,重点分析了领域(Realm)的核心概念。Realm作为身份验证的核心组件,包含MemoryRealm、JDBCRealm等不同实现方式,分别对应内存和数据库存储方案。文章详细解释了主体(Principal)与角色(Role)的关系,以及LoginConfig在认证流程中的引导作用。通过分析SimpleRealm和SimpleUserDatabaseRealm两个示例,展示了Tomcat如何实现用户认证:前者通过内存预置用户数据

wj_rdk的博客 2270

Tomcat的4种安全域

 1、内存域(MemoryReal)内存域是由org.apache.catalina.realm.MemoryRealm类来实现的。MermoryRealm从一个XML文件中读取用户信息。默认情况下,该XML文件为tomcat安装目录的conf/tomcat_users.xml。在这个文件中定义了每个用户拥有的角色。2、JDBC域JDBCRealm通过JDBC驱动程序访问存放在关系型数据库

samgu3663的专栏 979

tomcat 自定义404_Tomcat中的自定义LoginModule

tomcat 自定义404 Tomcat通过领域概念管理应用程序安全性。 领域是名称密码对的连贯包,用于标识Web应用程序的有效用户。 Tomcat的默认领域是MemoryRealm。 该领域读取著名的conf/tomcat-users.xml文件,并使用它检查名称密码对的有效性。 Tomcat还提供了一些领域,可以通过直接连接或通过配置的数据源来检查存储在数据库中的对。 这些所有领域的主要...

dlz00001的博客 139

Gretty 配置详解:从 contextPath 到端口的 15 个必备 DSL 属性

Gretty 配置是 Gradle 开发者的高频话题——这款高级 Gradle 插件能在 Jetty 和 Tomcat 上快速运行 Web 应用,而理解它的 15 个核心 DSL 属性,正是从"能跑"到"跑得顺手"的分水岭。无论你想修改 contextPath、调整 httpPort 端口,还是开启 HTTPS 与热部署,只需在 `build.gradle` 的 `gretty {}` 代码块里改

gitblog_00840的博客 653

Tomcat Basic认证

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34176694的博客 380
上一篇: Java认证和授权服务 JAAS 之 授权
下一篇: ubuntu linux 更换 阿里云 软件源 安装 svn
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值