(1)shiro简介和第一个demo

 讨论QQ群:313032825

<dependency>    <groupId>org.apache.shiro</groupId>    <artifactId>shiro-core</artifactId>    <version>1.2.2</version></dependency>
复制代码

在classpath下新增一个shiro.ini文件。文件内容如下:(意思就是在这个系统中存在zhang这个用户,密码是123,后期会用存储在数据库中的账户密码,这里方便测试和讲解。。)

复制代码
[users] zhang=123
复制代码

测试代码:

复制代码
        Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");         //得到安全管理器        SecurityManager securityManager = factory.getInstance();          SecurityUtils.setSecurityManager(securityManager);          Subject subject = SecurityUtils.getSubject();          UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");          try {             subject.login(token);         } catch (AuthenticationException e) {             e.printStackTrace();         }         System.out.println(subject.isAuthenticated());         subject.logout();          System.out.println(subject.isAuthenticated());
复制代码

最后输出

true
false。

 

1首先通过IniSecurityManagerFactory和shiro.ini文件生成一个SecurityManager工厂。

2获得该工厂的实例并托管给SecurityUtils这个类,其实就是放在了SecurityUtils这个类的一个static变量中,下面操作的底层还是SecurityManager里面的方法。

3通过SecurityUtils得到一个主体对象,此时这个对象里面是没有数据的,也没有通过认证和授权,在SecurityUtils.getSubject获取的同时将当这个subject绑定到了当前线程里面。(如果你再getSubject也是该subject)

4创建一个token绑定用户名和密码。然后调用subject.login进行登录(其实就是调用了SecurityManager进行认证和授权)

 

shiro核心架构图:

 

Authentication身份认证,通常用于校验密码等操作。

Authorization授权,权限验证,校验用户是否拥有某种角色,或者某种更细的资源。

 

这两个管理器分别持有Authenticator(认证器)和Authorizer(授权器)两个变量。(这里只贴图一张,还有一个可以看看源码)

这两个在java环境下的实现类分别是,ModularRealmAuthenticator(默认认证器)和ModularRealmAuthorizer(默认授权器)

 

并且在读取shiro.ini文件后默认创建了IniRealm对象,注入到上面的认证器和授权器中。(授权器也有个realms对象,realms存放着账号密码,对应的权限等信息)

最后创建了一个SecurityManager对象。

 

在调用subject.login(token);方法时候。会最终调用这个安全管理器的认证器对应的方法。

登录的时候如果账号密码异常,会抛出对应的异常。(这里还绑定了session,shiro的session和web中的session是两个概念,后面介绍)

 

到这里这个zhang的subject就登录成功了。

github地址

https://github.com/cmniefei/shiroparent

 

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信