使用Apache Shiro开展java认证说明

使用Apache Shiro进行java认证说明
     认证是尝试证明一个用户是谁的过程。为了进行认证,一个用户需要提供系统能够理解并信任的某种形式的身份证明。这个过程中我们需要了解的专业术语包括:

       Subject——指当前操作者,可以是人(用户)、第三方程序以及其他任何任何与我们应用程序交互的人或事物。

       Principals——是Subject的标示属性,如用户名、社会安全码(如中国的身份证号)

       Credentials——用于验证身份的秘密数据,如密码、生物特征识别数据(如指纹等)、x509证书等。

       Realms——用于访问后 端数据源的特定安全DAO、数据访问对象、软件组件等。例如如果我们使用LDAP存储用户名秘密,那么我们需要有一个与LDAP交互的LDAP Realm。故而,针对每一个后端数据源我们都需要一个Realm,并且Shiro也能够协调这些Realm来做我们需要做的事情。

   

      在java应用中使用shiro来进行认证可以分为三个步骤。

       1.收集subject的principals和credentials

       2.提交principals和credentials到认证系统

       3.认证后或允许访问、或尝试再次认证、或阻止访问。

 

      提到第一步收集principals和credentials,此处我们需要认识一个简单的支持多数认证机制的用户名/密码认证令牌(token)——UsernamePasswordToken。我们用它来绑定应用程序中已获取的用户名和密码。那如何获取用户名和密码呢?Shiro本身是不关系获取方 式的(与协议无关性),我们可以通过form 提交、http header或者命令行等方式传入java程序中。使用方式如下所示。

 

UsernamePasswordToken token =
new UsernamePasswordToken( username, password );

       第二步要做的事情就是将上一步中获取到的token提交到认证系统。什么是认证系统呢?在Shiro世界里,它是安全相关的DAOs,即前文提到Realms。整个提交认证过程示例如下所示。
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
      上面的代码做了什么呢?首先获取了当前执行操作的“用户”——subject——之后通过login方式提交前文创建的token来进行认证。

      而进行认证之后,如果成功我们即可登录了系统,并与相应的账号相关联而如果认证失败shiro会抛出异常,我们可以根据这些信息或重新尝试认证,或阻止访问等操作。相应代码如下所示。
try {
currentUser.login(token);
} catch ( UnknownAccountException uae ) { ...
} catch ( IncorrectCredentialsException ice ) { ...
} catch ( LockedAccountException lae ) { ...
} catch ( ExcessiveAttemptsException eae ) { ...
} ... catch your own ...
} catch ( AuthenticationException ae ) {
//unexpected error?
}
       最后,用户可以退出登录,调用currentUser.logout()我们就从shiro中退出登录了。shiro会关闭用户session,移除与当前subject实例相关联身份标示。