Shiro入门到精通之HelloWorld

简介

  • Apache Shiro 是 Java 的一个安全(权限)框架。

  • Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。

  • Shiro 可以完成:认证、授权、加密、会话管理、与Web 集成、缓存 等。

基本功能简介

  • Authentication:身份认证/登录,验证用户是不是拥有相应的身份;

  • Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用 户是否能进行什么操作,如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户 对某个资源是否具有某个权限;

  • Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有 信息都在会话中;会话可以是普通 JavaSE 环境,也可以是 Web 环境的;

  • Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;

  • Web Support:Web 支持,可以非常容易的集成到Web 环境;

  • Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可 以提高效率;

  • Concurrency:Shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;

  • Testing:提供测试支持;

  • Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

  • Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了

Shiro----helloworld

 1 public static void main(String[] args) {
 2     //工厂获取ini文件
 3     Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
 4     //创建一个securityManager实例
 5     SecurityManager securityManager = factory.getInstance();
 6     SecurityUtils.setSecurityManager(securityManager);
 7     // 获取当前的 Subject. 调用 SecurityUtils.getSubject();
 8     Subject currentUser = SecurityUtils.getSubject();
 9     // 测试使用 Session
10     // 获取 Session: Subject#getSession()
11     Session session = currentUser.getSession();
12     session.setAttribute("someKey", "aValue");
13     String value = (String) session.getAttribute("someKey");
14     if (value.equals("aValue")) {
15         log.info("---> Retrieved the correct value! [" + value + "]");
16     }
17     // 测试当前的用户是否已经被认证. 即是否已经登录.
18     // 调动 Subject 的 isAuthenticated()
19     if (!currentUser.isAuthenticated()) {
20         // 把用户名和密码封装为 UsernamePasswordToken 对象
21         UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
22         // rememberme
23         token.setRememberMe(true);
24         try {
25         // 执行登录.
26         currentUser.login(token);
27         }
28         // 若没有指定的账户, 则 shiro 将会抛出 UnknownAccountException 异常.
29         catch (UnknownAccountException uae) {
30         log.info("----> There is no user with username of " + token.getPrincipal());
31         return;
32         }
33         // 若账户存在, 但密码不匹配, 则 shiro 会抛出 IncorrectCredentialsException 异常。
34         catch (IncorrectCredentialsException ice) {
35         log.info("----> Password for account " + token.getPrincipal() + " was incorrect!");
36         return;
37         }
38         // 用户被锁定的异常 LockedAccountException
39         catch (LockedAccountException lae) {
40         log.info("The account for username " + token.getPrincipal() + " is locked.  "
41             + "Please contact your administrator to unlock it.");
42         }
43         // 所有认证时异常的父类.
44         catch (AuthenticationException ae) {
45         }
46     }
47     log.info("----> User [" + currentUser.getPrincipal() + "] logged in successfully.");
48 
49     // test a role:
50     // 测试是否有某一个角色. 调用 Subject 的 hasRole 方法.
51     if (currentUser.hasRole("schwartz")) {
52         log.info("----> May the Schwartz be with you!");
53     } else {
54         log.info("----> Hello, mere mortal.");
55         return;
56     }
57     // 测试用户是否具备某一个行为. 调用 Subject 的 isPermitted() 方法。
58     if (currentUser.isPermitted("lightsaber:weild")) {
59         log.info("----> You may use a lightsaber ring.  Use it wisely.");
60     } else {
61         log.info("Sorry, lightsaber rings are for schwartz masters only.");
62     }
63     // 测试用户是否具备某一个行为.
64     if (currentUser.isPermitted("user:delete:zhangsan")) {
65         log.info("----> You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  "
66             + "Here are the keys - have fun!");
67     } else {
68         log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
69     }
70     // 执行登出. 调用 Subject 的 Logout() 方法.
71     System.out.println("---->" + currentUser.isAuthenticated());
72     currentUser.logout();
73     System.out.println("---->" + currentUser.isAuthenticated());
74 
75     System.exit(0);
76     }
77 }

说明:此代码是下载shiro的源代码里面的quickstart里面包含了ini文件

         ini文件配置了用户的角色,权限等

用到的jar: log4j-1.2.15.jar  shiro-all-1.3.2.jar  slf4j-api-1.6.1.jar  slf4j-log4j12-1.6.1.jar

 

 

 

 

 

 

 

 

 

posted @ 2018-01-30 16:46  溪山夜雨  阅读(141)  评论(0编辑  收藏  举报