使用Apache Shiro进行身份验证(数据库方式)

的意义

我想在Web应用程序中使用数据库进行用户认证和权限管理。如果使用Apache Shiro,应该如何明确地实施呢?

请注意

由于依据较旧的资料来写,因此需要实际进行操作确认。

Apache Shiro的环境准备工作。

在pom.xml文件中添加以下内容,以便使用Maven。

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-core</artifactId>
  <version>1.2.2</version>
</dependency>
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-web</artifactId>
  <version>1.2.2</version>
</dependency>

Apache Shiro的配置

Shiro的设置以shiro.ini文件进行记录。文件名可以更改。

[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ?
jdbcRealm.userRolesQuery = SELECT authority FROM user_roles WHERE username = ?
jdbcRealm.permissionsLookupEnabled = false
ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
ds.serverName = localhost
ds.port = 3306
ds.user = ユーザ名
ds.password = パスワード
ds.databaseName = DB名
jdbcRealm.dataSource = $ds

在DB中设置身份验证信息。

通过authenticationQuery和userRolesQuery来配置如何从数据库中获取认证信息(作为SQL)。

请注意

这个例子中处理密码时使用的是明文,所以需要注意。另外,下面会描述处理已经进行哈希的密码的内容。

設定檔案的特點

shiro文件具有与DI容器的配置文件类似的含义,可以将类设置为变量名,就像实例变量一样使用。jdbcRealm就是一个例子。将该变量视为JavaBean,并通过设置属性进行配置。它具有一些保留名称,可以通过使用这些名称进行配置以改变其行为。

将其集成到Web应用程序中。

为了在Web应用程序中使用,需要在web.xml中应用ShiroFilter。

在web.xml文件中进行配置

我们将按照以下方式进行过滤器设置。

<listener>
  <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
  <filter-name>ShiroFilter</filter-name>
  <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  <init-param>
    <param-name>configPath</param-name>
    <param-value>classpath:shiro.ini</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>ShiroFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

在这个设置中,将会加载ClassPath下的shiro.ini文件。

权限管理的方式

作为Web应用程序的权限管理,可以使用基于URL的权限管理。为此,需要在shiro.ini文件中进行追加。
由于基本身份验证和表单身份验证的操作方式不同,因此分别进行描述。

基本认证

[urls]
/mnt/** = authcBasic,roles[admin]

在这个例子中,基本认证下,只有授权用户的角色为管理员才能访问/mnt目录下的内容。

表格认证

[urls]
/mnt/** = authc,roles[admin]
[filters]
authc.loginUrl = /login.jsp

在設置中,將原先的物件名稱由authBasic改為authc。

这是一个名为authcBasic.authc的保留名,它是定义基本认证(org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter)和表单认证(org.apache.shiro.web.filter.authc.FormAuthenticationFilter)的类。

密码加密

通常情况下,为了安全起见,不建议将密码以明文形式存储在数据库管理系统中,而是使用诸如SHA1等哈希算法进行编码和存储。

使用Shiro来对密码进行编码的设置如下:
负责管理密码认证的是CredenialMatcher,
支持SHA1的CredenialMatcher是Sha1CredentialsMatcher。
因此,

credentialsMatcher = org.apache.shiro.authc.credential.Sha1CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = true
jdbcRealm.credentialsMatcher = $credentialsMatcher

通过进行设置,可以实现相应的功能。

广告
将在 10 秒后关闭
bannerAds