Shiro--初识Shiro

来源:互联网 发布:2017经济下行 知乎 编辑:程序博客网 时间:2024/06/11 01:58

1 Shiro简介
Shiro是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。
 Authentication:有时也简称为“登录”,这是一个证明用户他们是谁的行为。
 Authorization:访问控制的过程,也就是决定“谁”去访问“什么”。
 Session Management:管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
 Cryptography:通过使用加密算法保持数据安全同时易于使用。

2 初识Shiro。
一个官方简单的例子。代码说明均在注释中,不在重复。
具体代码:

public class Quickstart {    private static final transient Logger log = LoggerFactory            .getLogger(Quickstart.class);    public static void main(String[] args) {        Factory<SecurityManager> factory = new IniSecurityManagerFactory(                "classpath:shiro.ini");        SecurityManager securityManager = factory.getInstance();        SecurityUtils.setSecurityManager(securityManager);        // 获取当前用户        Subject currentUser = SecurityUtils.getSubject();        // 此处的Session是Shiro中的。不是web中的。        Session session = currentUser.getSession();        session.setAttribute("someKey", "aValue");        String value = (String) session.getAttribute("someKey");        if (value.equals("aValue")) {            log.info("Retrieved the correct value! [" + value + "]");        }        // 判断当前用户是否通过认证        if (!currentUser.isAuthenticated()) {            // 当前用户没通过认证,使用UsernamePasswordToken封装用户和密码            UsernamePasswordToken token = new UsernamePasswordToken(                    "lonestarr1", "vespa");            token.setRememberMe(true);            try {                // 执行认证操作,即登录,此处模拟的是遍历配置文件中各个组合。                currentUser.login(token);            } catch (UnknownAccountException uae) {                // token.getPrincipal()获取当前用户的用户名                log.info("There is no user with username of "                        + token.getPrincipal());            } catch (IncorrectCredentialsException ice) {                log.info("Password for account " + token.getPrincipal()                        + " was incorrect!");            } catch (LockedAccountException lae) {                log.info("The account for username " + token.getPrincipal()                        + " is locked.  "                        + "Please contact your administrator to unlock it.");            } catch (AuthenticationException ae) {            }        }        // 输出当前用户的用户名        log.info("User [" + currentUser.getPrincipal()                + "] logged in successfully.");        // 检查当前用户是否为改角色        if (currentUser.hasRole("schwartz")) {            log.info("May the Schwartz be with you!");        } else {            log.info("Hello, mere mortal.");        }        // 检测当前用户是否有指定操作的权限        if (currentUser.isPermitted("lightsaber:weild")) {            log.info("You may use a lightsaber ring.  Use it wisely.");        } else {            log.info("Sorry, lightsaber rings are for schwartz masters only.");        }        // 检测某一类型的实例是否具有某一具体操作的权限        // goodguy = winnebago:drive:eagle5:表示当前用户可以对winnebago实体的eagle5实例做drive操作        if (currentUser.isPermitted("winnebago:drive:eagle5")) {            log.info("You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  "                    + "Here are the keys - have fun!");        } else {            log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");        }        // 退出        currentUser.logout();    }}

本文部分摘自官方法文档,详情请自行查阅官方文档。