用Shiro实现简单的身份验证

来源:互联网 发布:底盘弹簧增高垫淘宝 编辑:程序博客网 时间:2024/05/22 09:00

用Shiro实现简单的身份验证

注意:记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。
也就是实现Realm接口

在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份:

principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个 principals,但只有一个 Primary principals,一般是用户名 / 密码 / 手机号。

credentials:证明 / 凭证,即只有主体知道的安全值,如密码 / 数字证书等。

首先加入Maven依赖

<dependencies>    <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <version>4.9</version>    </dependency>    <dependency>        <groupId>commons-logging</groupId>        <artifactId>commons-logging</artifactId>        <version>1.1.3</version>    </dependency>    <dependency>        <groupId>org.apache.shiro</groupId>        <artifactId>shiro-core</artifactId>        <version>1.2.2</version>    </dependency></dependencies>

加入JUnit测试

public class LoginLogoutTest {    @Test    public void testHelloWorld(){        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");        //得到SecurityManager实例,并绑定给SecurityUtils        SecurityManager securityManager = factory.getInstance();        SecurityUtils.setSecurityManager(securityManager);        //得到Subject及创建用户名/密码身份的Token        Subject subject = SecurityUtils.getSubject();        UsernamePasswordToken token = new UsernamePasswordToken("gao","520");        try {            subject.login(token);        }catch (AuthenticationException e){            System.out.println("身份验证失败");        }        Assert.assertEquals(true,subject.isAuthenticated());        //退出        subject.logout();    }}

从上面的代码可以看到,使用Shiro需要进行以下的步骤
- 首先通过 new IniSecurityManagerFactory 并指定一个 ini 配置文件来创建一个 SecurityManager 工厂;
- 接着获取 SecurityManager 并绑定到 SecurityUtils,这是一个全局设置,设置一次即可;

  • 通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程;如果在 web 环境在请求结束时需要解除绑定;然后获取身份验证的 Token,如用户名 / 密码;

  • 调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录;

  • 如果身份验证失败请捕获 AuthenticationException 或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;

  • 最后可以调用 subject.logout 退出,其会自动委托给 SecurityManager.logout 方法退出。

可以通过实现Realm接口,来获取自己的验证规则

    public class MyRealm1 implements Realm {    @Override    public String getName() {        return "myrealm1";    }    @Override    public boolean supports(AuthenticationToken authenticationToken) {        return authenticationToken instanceof UsernamePasswordToken;    }    @Override    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {        String testName = "gao";        String testPassword = "520";        //得到用户名        String userName = (String) token.getPrincipal();        System.out.println("得到的用户名为"+userName);        //得到密码        String password = new String((char[]) token.getCredentials());        System.out.println("得到的密码为"+password);        if (!testName.equals(userName)){            throw new UnknownAccountException();        }        if (!testPassword.equals(password)){            //代表密码错误            throw new IncorrectCredentialsException();        }        return new SimpleAuthenticationInfo(userName,password,getName());    }}

使用自己重写的规则之后,在shiro.ini文件中进行一些配置,文件存放在resources目录下

myRealm1 = com.gaojiancheng.demo.shiro.MyRealm1securityManager.realms = $myRealm1

运行测试代码,正确则测试通过

原创粉丝点击