【授权翻译】透彻(Shiro/Keith)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【授权翻译】透彻(Shiro/Keith)相关的知识,希望对你有一定的参考价值。

参考技术A 原文:http://archiveofourown.org/works/10251023

--------------------------------------------------------------------------

透彻(all over)

Shiro用肩膀推开Keith的房门,辅佐着搭在自己肩上的Keith走进房内。在离开Marmora的基地后Keith声称靠自己能走,但Shiro表示怀疑。看着他蹒跚的步伐,费力的呼吸,Shiro感到整个心都揪了起来。

他们没有向其他人说明情况。这次任务实在是太沉重,并不是三言两语就能解释清楚的。Keith已经累得说不出话来,Shiro也没有资格向其他人揭露Keith的身世。这件事应该日后再谈。

Shiro把Keith带到床边,然后帮助他坐下。他并没有立刻放开两人依然交缠的双手,倒是Keith先打破了这份接触,Shiro虽然理解他的用意,但还是怀念起先前亲密的感觉。

Keith交叉双臂,就像在寒夜中取暖一般环抱住自己。Shiro蹲在他面前,与他视线齐平。

“你还好吗?”Shiro问道。

这根本就是废话,在遭到连续不断的殴打,还得知自己与敌人拥有相同的血统后,Keith当然不会好过。Shiro知道他的感受,但不想让他一个人承受。Shiro自己与Galra的联系曾经让他接近崩溃,他不希望Keith也遭到这种折磨。如果他有能力可以缓解Keith的伤痛,他会努力去争取。

Keith没有抬头看他,只是缓缓点头。

“Shiro,我——为什么你还在这里?”

Shiro感觉心刺痛了一下,但依然装作面不改色。经历了这么多,Keith想要独处的心情是可以理解的。

“你想的话,我可以离开。我只是想确保你没事。放心好了,在你准备好之前,我不会向其他人透露一个字的。”Shiro说完,不经意地将右手搭上Keith的肩膀。Keith吃痛地眨着眼,让Shiro以为自己伤到了Keith而感到惊慌,随即将手撤回。

“抱歉。”Shiro说道,耳边猛烈的心跳声几乎让他听不见自己的声音。

“等等!”Shiro正要转身,Keith叫住了他。“这不是你的错。我只是肩膀受了伤…”

Shiro突然回忆了起来。在他们匆忙撤离的过程中,他居然完全忘记Keith被刺伤了。

“Keith, 你的伤口在流血吗?需不需要送你去治疗舱?”他关心地问道。

“不要!”Keith激动地反驳道,但随即镇静了下来。他的指尖划过左肩上的伤口,小声嘀咕道:“我只想待在这里,而且伤口也不是很严重。”

看着Keith这个样子,Shiro很想伸出手去抚慰他,想用指尖扫过他的颧骨和下巴感受他的轮廓。但他抑制住了这份冲动。

“你把这身衣服脱了,再换上新的也许会更好受一点。”Shiro努力地从哽住的喉咙里挤出字眼。

他早就应该离开,让Keith一个人好好静一静。但他却驻在原地,无法将视线从Keith身上移开。就算Keith全身伤痕累累,他身上的魅力依然存在。

Keith抬头与Shiro对视,眼神中带着无法掩饰的脆弱。“你能帮我脱吗?”

Shiro倒吸了一口凉气。他已经脑补过这场景无数次:Keith带着那双好看的眼睛恳求Shiro为他脱衣。但两者性质不同。这里是现实,他不能理所当然地认为自己能为Keith带来幸福。白日梦应该永远埋藏在心里。

“我以为你想让我离开的。”他回忆起Keith之前说过的话。

Keith轻笑了一声,回答道:“你应该了解我的。”

Shiro竭力抑制住心中随着Keith的话语带来的喜悦,也忍住不去回忆早些时候因为Keith的意愿而出现的自己的幻象。他不知道这意味着什么,但是现在并不是讨论这个话题的好时机。

当屋内的寂静蔓延到难以忍受时,Shiro开口说道:”好吧,我来帮你脱。你说什么我都会做。”

Keith还没开口,Shiro就从Keith的衣柜中拿出了几件干净衣服。他把衣服放到床沿,坐到Keith身旁,然后让他转身。

Shiro的指尖颤抖着拉下Keith颈后的拉链,被衣服包裹住的脖颈随即裸露出来,Shiro忍住自己想俯身亲上去的欲望。

一旦拉链拉到底,Shiro便从两边剥开Keith上身的衣服,他的指尖滑过Keith嶙峋的锁骨,想象着自己的嘴唇贴上Keith的皮肤,轻轻地用牙齿咬出印记,然后再舔舐干净的感觉。但他什么也没做,只是继续往下脱,不让自己的目光往Keith身上偏移。等到他做得差不多时,便开口说道:

“你来脱剩下的吧。我会闭上眼睛的。”他说完,Keith也默默点点头。

Shiro闭上眼睛,脑海里却忍不住开始想象Keith现在的样子,填补着他遗留下的空白。

“我穿好了。”Keith说完,Shiro立刻睁开眼睛,看见Keith已经换上了便服,就好像什么都还没发生,他们还可以回到从前一样。不过Shiro知道这已经不可能了。

“你看起来不像是被殴打过的样子呢。”他微笑着打趣道。

Keith不安地用指尖扫过头发,然后说道:“Shiro,刚才我问你为什么还在这……”

“哦,那个啊。我会马上离开,让你好好休息的。”Shiro装作自己早已忘记Keith的话语,而不是自他说出口后就一直在意着这件事。

“我不想让你离开。但是,为什么你还留在我身边?你不恨我吗?”Keith的声音变得沙哑起来,

Shiro摆出难以置信的表情,问道: “我为什么要恨你?”

Keith咬着嘴唇稳住自己的情绪,但还是忍不住破口而出:“你当然应该恨我啊!我们刚刚得知我是一个Galra,就是绑架你虐待你,还把你的手臂夺走的那群人啊……”

Shiro早就料到他会这样说。“然后你觉得这是你的错?”

Keith摇摇头。“不,但这又有什么差别。看见我应该让你愤怒,你不想再待在我身边了!”

Shiro看着Keith的脸上因为情绪激化而变红,眼角也变得湿润。他全身颤抖,眼神不停地在Shiro与地板间游离。Shiro深吸了一口气。

“你应该了解我的。”他重复着Keith所说的话。

Keith还想继续冲他理论,但Shiro一把抓住Keith的衣领扯到一边,露出已经开始结疤的伤口。

“你和我又有一处共同点了。” Shiro说道,他脸上的微笑让Keith感到不知所措。

“什么意思?”Keith问道,而Shiro只是抬起右臂在他面前晃了晃。

“我们的身体和伤疤上都被刻上了Galra的标记。但这又能说明什么?这并不能改变曾经的我们,永远不会。”Shiro说完,不知道怎样做才能缓解气氛,只好俯身亲上Keith的脸颊。Keith的头发挠得Shiro发痒,但他的发质就像Shiro想象的一样柔软。感受到亲吻的Keith也立刻抬起头回应,贴上Shiro的嘴唇与他来一个正式的接吻。

他俩分开了几秒来维持呼吸,但很快Keith又凑了上来,让Shiro忍不住发出一声叹息。与Keith接吻让他沉醉其中,他感觉Keith就是他活下去的唯一动力,虽然他知道这种想法很自私。

过了一会儿,Keith退了回去,双手捧着Shiro的脸颊低语道:“留下来吧。” 他忍不住去回想先前离他而去的幻象Shiro,就感觉一阵钻心的痛袭来。他需要真的Shiro,这个一直会接纳他的Shiro陪伴着他,他现在不想独自一个人承受。

Shiro点点头,虽然他的脑海里依然萦绕着许多问题,不停地悬在他的心头:他们今后的未来会如何,这份关系能否影响到他的领导地位,他在Keith心中的地位又是如何,他能否给keith相应的安慰…但就在此刻,这些问题显得无足轻重。

为了Keith,他愿意把所有的问题都暂时推到一边。他感受到Keith抱住自己,知道Keith现在最需要的就是他,所以他回应道:“我会一直陪你的。”

—END—

翻译Apache Shiro10分钟教程

本文为翻译文,原文地址:http://shiro.apache.org/10-minute-tutorial.html

介绍

欢迎来到Apache Shiro的10分钟教程!

通过这个教程,你会完全明白一个开发人员如何在他们的应用中使用Shiro,你也能够在10分钟内做到。

概述

什么是Apache Shiro?

Apache Shiro是一个强大的、易用的Java安全框架,它在身份验证、授权、加密、会话管理方面,为开发人员提供直观、全面的解决方案。

Apache Shiro能做什么事情?

很多。不过我们不想在入门阶段就全部展开。如果你想知道它能帮你做什么,请查阅我们的描述特性的网页。如果你好奇我们的起源和我们的存在,请查阅描述我们的历史和任务的网页。

好了,现在我们开始吧。

请注意:
Shiro能运行在任何环境,无论简单的命令行,或者大型的Web集群应用,不过我们在此快速入门会用最简单的例子,比如main方法,这样你就能了解这些API。

下载

  1. 保证已经安装JDK1.6+、Maven3.0.3+
  2. 在下载页下载最新的“Source Code Distribution”。在本例中,我们使用1.3.2 release distribution。
  3. 解压

    $ unzip shiro-root-1.3.2-source-release.zip
  4. 进入quickstart目录

    $ cd shiro-root-1.3.2/samples/quickstart
  5. 运行QuickStart

    $ mvn compile exec:java

    它的目标只是打印一些日志信息让我们知道发生了什么,然后退出。在阅读本快速入门,随时查阅代码samples/quickstart/src/main/java/Quickstart.java。尝试改变文件,运行以上的命令mvn compile exec:java

Quickstart.java

上述的Quickstart.java文件包含全部我们需要熟悉的API,现在我们分块来看,使我们更容易理解究竟发生了什么。

在几乎所有的环境中,你能通过以下代码获取当前执行用户:

Subject currentUser = SecurityUtils.getSubject();

使用SecurityUtils.getSubject(),我们能获取当前执行的SubjectSubject可看作只是一个应用程序的用户的主题视图。我们实际想叫它“用户”显得“有意义”,但我们最后还是没有这么做。因为太多的应用程序存在他们自己的User类或框架,我们不太与之发生冲突。另外,在安全的领域里,这个词实际上是工人的术语。

在独立的应用中使用getSubject(),它可能返回一个特定应用的用户,如果在一个服务器环境(比如Web应用),它在当前线程或传入的请求中查找关联的用户。

现在,你有了Subject对象,你能够做什么事情呢?

如果你想使某些东西在当前应用的当前会话中可用的,你可以先获取Session:

Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );

Session是Shiro指定的对象,提供了大部分我们常用的普通的HttpSession,但有一些额外的好处和一个重大的区别:它不需要一个HTTP环境!

如果部署在Web应用中,默认情况下Session就是HttpSession。但是,如果在非Web应用中,比如上面的Quickstart.java,Shiro会自动地使用它企业级会话管理。这意味着,无论在任何环境,你都可以使用相同的API。这打开了一个全新的世界,因为任何应用程序需要会话,不需要强制使用HttpSession或EJB有状态的Session Bean。并且,任何客户端技术可以共享会话数据。

现在我们能获取用户和会话了。有真正有用的事情吗?比如检查他是否被允许做这个事情?比如检查角色和权限?

好,我们对用户做这些检查。我们上述的Subject代表当前用户,但当前用户是谁呢?他们是匿名的,直到他们至少登录了一次。所以,我们做一次登录吧:

if ( !currentUser.isAuthenticated() ) {
    //collect user principals and credentials in a gui specific manner
    //such as username/password html form, X509 certificate, OpenID, etc.
    //We'll use the username/password example here since it is the most common.
    //(do you know what movie this is from? ;)
    UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
    //this is all you have to do to support 'remember me' (no config - built in!):
    token.setRememberMe(true);
    currentUser.login(token);
}

就是这样!但它并不简单。

但如果他们登录失败呢?你能捕获各种具体的异常,这些异常能告诉你究竟发生了什么,你可以根据这些做出响应的处理:

try {
    currentUser.login( token );
    //if no exception, that's it, we're done!
} catch ( UnknownAccountException uae ) {
    //username wasn't in the system, show them an error message?
} catch ( IncorrectCredentialsException ice ) {
    //password didn't match, try again?
} catch ( LockedAccountException lae ) {
    //account for that username is locked - can't login.  Show them a message?
}
    ... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {
    //unexpected condition - error?
}

你可以检查不同类型的异常。

方便的提示:
当用户登录失败,安全的最佳实践是给与常规的模糊的提示,比如登录失败,因为我们不希望帮忙攻击者尝试攻击我们的系统。

好,现在我们有一个登录用户。我们还能做什么?
比如说他们是谁?

//print their identifying principal (in this case, a username): 
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(); //removes all identifying information and invalidates their session too.

这是开发人员使用Apache Shiro的核心知识,虽然一些很复杂的逻辑隐藏在引擎盖下面。

你可能会问自己,在登录时,谁负责获取用户的数据(用户名、密码、角色、权限等)?在程序运行时谁执行这些检查?恩,你做,通过实现Shiro所说的Realm等等。

然而,如何配置一个Realm很大程度上依赖于运行环境。比如,如果你运行一个独立的应用,或者是Web应用,或者是Spring应用,或J2EE应用,再或者它们的合并体。这种类型的配置在此快速入门的范围之外,因为此快速入门的目的是让我们熟悉API和Shiro的概念。

当你准备跳入更多细节,你一定会想要阅读认证指南和授权指南。然后可以移动到文档,特别是参考手册,去了解各种其它问题。你可能会想加入用户邮件列表,你会发现我们有一个热情的社区。

感谢您的阅读。我们希望你享受使用Apache Shiro!

以上是关于【授权翻译】透彻(Shiro/Keith)的主要内容,如果未能解决你的问题,请参考以下文章

charles3.8的中文乱码怎么解决

(转)shiro权限框架详解05-shiro授权

Shiro-Spring 授权操作

SpringBoot整合Shiro 四:认证+授权

Day374.shiro授权&Shiro+jsp整合Springboot -Shiro

源码分析 shiro注解授权