Apache Shiro学习

一.定义:Apche Shiro 是一个功能强大,使用简答的Java安全框架,为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案.

         其主要功能是:管理应用程序中与安全相关的全部,同时尽可能的支持多种实现方法.

下载路径:http://shiro.apache.org/download.html

  1. 进入快速指南文件夹

    cd shiro-root-1.1.0/samples/quickstart

  2. 运行快速指南

    mvn compile exec:java

  3.代码剖析 几乎所有的环境下,都可以通过这种方式获取当前用户:

    Subject currentUser = SecurityUtils.getSubject();

    Subject是应用中用户的一个特定安全的缩影,虽然感觉上直接使用User会更贴切,但是实际上它的意义远远超过了User。  而且每个应用程序都会有自己的用户以及框架,我们可不想和它们混淆在一起,况且Subject就是安全领域公认的名词。

如果你想得到应用中用户当前Session的其他参数,可以这样获取Session对象:

Session session = currentUser.getSession();

session.setAttribute( "someKey", "aValue" );

这个Session对象是Shiro中特有的对象,它和我们经常使用的HttpSession非常相似,但还提供了额外的东西,其中与HttpSession最大的不同就是Shiro中的Session不依赖HTTP环境(换句话说,可以在非HTTP 容器下运行)。

如果将Shiro部署在web应用程序中,那么这个Session就是基于HttpSession的。但是像QuickStart示例那样,在非web环境下使用,Shiro则默认使用EnterpriseSessionManagment。

补:API:应用程序接口

现在你可以得到当前Subject和它的Session对象。那么我们如何验证比如角色和权限这些东西呢?

可以通过已得到的user对象进行验证。Subject对象代表当前用户,但是,谁才是当前用户呢?

if ( !currentUser.isAuthenticated() ) {

UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");

token.setRememberMe(true);

currentUser.login(token);

}try {

currentUser.login( token );

} catch ( UnknownAccountException uae ) {

}

可以捕获Shiro提供的各种异常,最安全的做法是将登录失败的消息告知用户

//拿到登录的用户

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.");

}

当然,还可以进行功能强大的实例级别的权限验证。通过它可以判断用户是否有访问特定类型实例的权限:

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();

session too.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值