首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Apache Shiro 简介(2)

Apache Shiro 简介(2)

用户令牌在 Shiro 术语中,令牌 指的是一个键,可用它登录到一个系统。最基本和常用的令牌是 UsernamePasswordToken,用以指定用户的用户名和密码。               
UsernamePasswordToken 类实现了                         AuthenticationToken 接口,它提供了一种获得凭证和用户的主体(帐户身份)的方式。                        UsernamePasswordToken 适用于大多数应用程序,并且您还可以在需要的时候扩展 AuthenticationToken 接口来将您自己获得凭证的方式包括进来。例如,可以扩展这个接口来提供您应用程序用来验证用户身份的一个关键文件的内容。               
简单的身份验证至此,这个简单的示例涵盖的内容包括:启动 Shiro                        SecurityManager、获得当前用户并记录下用户未经身份验证。接下来的这个例子将会使用                        UsernamePasswordToken 和存储在 INI 文件内的一个用户记录来展示如何通过用户名和密码进行身份验证。               
内所示的 auth.ini 文件现在包含了一个用户记录;这个记录包含了用户名和密码。您可以在这个记录内定义角色以及为应用程序提供授权。               
清单 3. auth.ini 文件
1
2
[users]
bjangles = dance




现在,创建  中介绍的这个 UsernamePasswordToken 对象,如  所示。               
清单 4. 使用 UsernamePasswordToken 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// snipped... same as before.
public class ShiroTest {

    private static Logger logger = LoggerFactory.getLogger(ShiroTest.class);

    public static void main(String[] args) {
        // Using the IniSecurityManagerFactory, which will use the an INI file
        // as the security file.
        Factory<org.apache.shiro.mgt.SecurityManager> factory =
            new IniSecurityManagerFactory("auth.ini");

        // Setting up the SecurityManager...
        org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        Subject user = SecurityUtils.getSubject();

        logger.info("User is authenticated:  " + user.isAuthenticated());
         
        UsernamePasswordToken token = new UsernamePasswordToken("bjangles", "dance");
         
        user.login(token);
         
        logger.info("User is authenticated:  " + user.isAuthenticated());
    }
}




UsernamePasswordToken 对象由用户名和密码的组合实例化。随后,令牌被传递至                         Subject 类的 login()                         方法。               
再次运行这个示例。注意到登录消息现在报告说此用户已经身份验证。               
要确保代码正常工作且获得的不是一个误报,在代码内更改密码或更改这个 INI 文件并再次运行此示例。login() 方法现在会抛出一个                        IncorrectCredentialsException。在生产代码内这个异常应被明确捕获以便应用程序在用户提供了不正确的代码时能够进行恰当的响应。               
如果用户不正确,login() 方法就会抛出一个                         UnknownAccountException。我们既要考虑如何处理这个异常,但又不应向用户提供太多信息。一种常见的做法是不要向用户提示用户名有效、只有密码不正确。这是因为如果有人试图通过猜测获得访问,那么您绝对不会想要暗示此人他所猜测的用户名是正确的。
返回列表