Shiro 开发文档中文版

所需积分/C币:14 2018-04-10 14:23:52 1.12MB PDF
12
收藏 收藏
举报

Shiro,一种应用系统权限开发的API,里面是中文版,分享给大家
该教程需要Java15及更高本。我们也使用 Apache Maven作为我们的构建上具,但当然这不是使用 Apache shiro所 必需的。你可以获取Shro的jar包并按你喜欢的方式合并到你的应用程序,例如可能是一 Apache Ant和wy 对亍教程,请确保你正在使用 Maven2.2.1或更高版本。你应该能够键入mvn- version命令行提示符,并看到与 下面类似的东西 Testing Maven Installation m=====m=== hazlewood:/shiro-tutorials mvn --version Apache maven2.2.1(r801777:2009-08-0612:16:01-0700 Java version: 1.6.0 24 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0. jdk/Contents/Home Default locale: en_ US, platform encoding: MacRoman 1 OS name: mac os x version: 10.6.7 arch:x86 64 Family:mac 现在,在你的文件系统上创建个新的录,例如, shiro-tutoria|并在该目录下保存下面的 Maven pom.xm文件: pom.xml <?xml version="1.0"encoding=UTF-8?> project xmins="hTtp: //maven. apache org/pom/4.0.0 mins:xsI="http://www.w3.org/2001/xmlschema-instance hemalocation="htTp: //maven. apache org/pom/4.0.0 http://maven.apacheorg/maven-v400.xsd"> <modelVersion>4.0.0</moderVersion> <groupldsorg. apache shiro. tutorials</groupld> <artifactld>shiro-tutorials/artifactld> version>1.0.0-SNAPSHOT</version> <name>First Apache Shiro Application</name> <packaging>jar</packaging> <properties> <project build source Encoding>UTF-8</project build source Encoding> </properties> <build> plugins> <plugin <groupld>org. apache maven. plugins</groupld> <artifactld>maven-compiler-plugins/artifactld> <version>2.0.2</version> <configuration> <source>1.5</source> <target1. 5</target> <encoding>sproject. build source Encodings/encoding> </configuration> </plugin> - This plugin is only to test run our little application It is not needed in most Shiro-enabled applications:--> <plugin> <groupld>org. codehaus. mojo</groupld> <artifactld>exec-maven-plugin</artifactld> <version>1.1</version> <executions execution> goa goal>java</goal> /goals </execution> </executions> <configuration> <classpath Scope>test</classpath Scope> <main Class>Tutorial</main Class> /configuration plug </plugins> / build <dependencies> <depend <groupld>org. apache shiro</groupld> <artifactld>shiro-core</artifactld> <version>1.1.0</version> </depende <l--Shiro use Slf4J for logging. We ll use the 'simple binding inthisexampleapp.Seehttp://ww.slf4j.orgformoreinfo.-> <dependency> org.slf4j</groupl <artifactld>slf4j-simple</artifactld> <version1.6.1</version> <scope>test</scope> </dependency> <dependencies> </project> The Tutorial class 我们将运行个简单的命令行应用程序,因此,我们需要创建个拥有 public static void main(String[args)方法的Java 类 在包含你 pom. Xm文件的同样∏录下,创建 src/main/java子∏录。在src/main/java月录下创建具有下面内容的 Tutorial. java文件: src/main/java/Tutorial. java import org. apache shiro. SecurityUtils import org. apache shiro. auth. import org. apache shiro. config. Ini Security Manager Factory; import org. apache shiro. mgt. SecurityManager; import org. apache shiro. session. Session import org. apache shiro. subject Subject import org. apache shiro. util. Factory; import org.slf4j Logger import org. slf4j Logger Factory; public class Tutorial i private static final transient Logger log= LoggerFacutory getlogger(Tutorial class): public static void main (String[] args)i log. info "My First Apache Shiro Application ); System. exit(o); 现在不必担心 Import语句——我们不久将会涉及到它们。但现在,我们得有个命令行应用程序“外形”。该程序 所能够做到全部事情是打印出文本" My First Apache Shiro Application"并退出。 Test run 要试用我们的教程应用程序,请在你的教程项目的根目录下执行以下的命令提示符,并键入以下内容: mvn compile exec: java 然后你将看到我们的 little教程“程序”运行并退山。你应该会看到与下面相似的些东西(注意粗体文本,它显 示了我们的输出): Run the application Hazlewood: /projects/shiro-tutorials mvn compile exec: java a bunch of Maven output 1 [Tutorial main (] INFO Tutorial - My First Apache Shiro Application hazlewood: /projects/shiro-tutorial \$ 我们已经验证了该程序运行成功一一现在让我们启用 Apache Shiro,当我们继续本教程的时候,你可以在每次我们 添加一些代码后运行 mvn compile exec:java来观察我们变化后的结果。 Enable shiro 在应用程序屮启用Shro最先要明白的事情是几乎在Sho中的你个东西都与一个名为 Security Manager的主要的/核 心的组件有关。对于那些熟悉Java安全的人来说,这是 Shiro的 SecurityManager概念——它不等同于 java. lang. Security Manager 虽然我们将在 Architecture章节详细的涉及到shio的设计,但现在了解Shro的 SecurityMManager是应用程序的Shro 环境的核心及个应用程序屮必须存在一个 Security Manager是很有益处的。因此,在我们的教程应用程序屮第 件要做的事情就是配置 Security Manager实例。 Configuration 虽然我们能够直接实例化一个 Security Manager类,但 Shiro的 SecurityManager实现有足够的配胃选项及内置组件 使得在Java源代码做这件事情变得较为痛苦—一如果使用一个灵活的基于文本的配置格式来配置 Security Manager, 那么这将是一件很容易的事情。 为此, Shiro通过基于文本的IN猷置文件提供了一个默认的"共性( common denominator)"解决方案。近来人们 经相当厌倦∫使用笨重的XML文件,且IN文件易于阅读,使川简单,依赖性低。你稍后将会看到有了对象导航图 的简单理解,IN文件能够有效地被用来配置简单的对象图,如 Security Manager Many Configuration Options Shiro的 Security Manager实现及所有支持组件都是兼容 Javabean的。这允许Sho 能够与几乎任何配置格式如ⅩML( Spring,Bos, Guice等等),YAML,SON,Grow Builder markυp,以及更多配置被一起配置。IN文件只是 Shiro的“共性”格式,他 它允许任何环境下的配置,除非其他选项不可用。 shiro ini 因此,我们将为这个简单的应用程序使用|N文件来配置 Shiro security Manager。首先,在 pom.xm所在的同一目录 下创建src/main/ resources目录。然后在新目录下创建包含以下内容的 shiro.in文件 src/main/resources/shiro. ini Tutorial INI configuration # Usernames/passwords are based on the classic Mel Brooks filmSpaceballs: # Users and their (optional) assigned roles username= password, rolel, role2,.., roleN users root secret, admin guest guest, guest presidentskroob 12345, president arkhelmet ludicrousspeed, darklord, schwartz lonestarr vespa, goodguy, schwartz i Roles with assigned permissions roleName perml, perm2,.., permN Roles admin schwartz = lightsaber i goodguy winnebago: drive: eagles 如你所见,这个配置基本上建立了一小组静态用户帐户,对丁我们的第一个应用程序已经足够了。在后面的章节中, 你将看到我们如何使用更复杂的用户数据源,如关系数据库,LDAP的 Acitve Directory,以及更多。 Referencing the Configuration 现在我们已绎定义好了一个N文件,我们可以在我们的教程应用程序类中创建 SecurityManager实例了。改变main 方法米反映以下的更新内容: public static void main(String[] args) t : log, info(My First Apache Shiro Application): Factory <SecurityManager> factory new IniSecurityManagerFactory( classpath: shiro. ini SecurityManager securityManager factory getInstance o SecurityUtils set SecurityManager(securityManager): System. exit(0) 好了,在仅仅添加了3行代码后,Shio就在我们的简单应用程序中启用了!很容易是吧? 轻松地运行 mvn compile exec: java,并看到这一切仍然运行成功(由 ]. Shiro的默认调试日志或更低版本,你将不会 看创任何的 Shiro日志消息如果在启动和运行没有报错,那么你知道一切仍然止常)。 这里是上面增加的代码所做的: 我们使用 Shiro的 Ini SecurityManager实现米提取我们的 shirc.in文件,它位于 classpath的根目录。该实现反 映了 Shiro对工厂设计模式的支持。 classpath:前缀是一个资源定位符,用来告诉 shiro去哪加载ini文件(其 他前缀,如url:和fie:也同样被支持) 2. factory getInstance()方法被调用,它来解析N文件并返回反映该配置的 Security Manager实例。 3.在这个简单的例子中,我们把 SecurityMManager设置为一个静态的( memory)单例,能够跨JM访问。但请 注意,这是不可取的,如果你在单个的M只屮会有不只一个启用Shro的应用程序。对于这个简单的例子 而言,这是没有问题的,但更为复杂的应用程序境通洺将 SecurityManager置于应用程序特定的冇储中(如 在Web应用中的 Servletcontext或 Spring,Guce后 JBOss DI谷器实例)。 Using Shiro 现在我们的 Security Manager已经设置好并可以使用了,现在我们能够开始做一些我们真正关心的事情—执行安 全操作。 当保护我们的应用程序时,我们对自己可能提出的最为相关的问题是“当前用户是谁”或“当前用户是否被允许做 XX”。当我们编写代杩或设计用户接口时,问这些问题是很常见的:应用程序通常是基于用户的背景情况建立的, 且你想基于每个用户标准体现(保障)功能。因此,对于我们考虑应用程序安全的最自然的方式是基于当前用户。 Shio的AP使用它的 Subject概念从根本上代表了“当前用户”的概念。 几乎在所有的环境中,你可以通过下面的调用获取当前正在执行的用户 i Subject currentUser SecurityUtils. getSub ject o 使用 SecurityUtils getsubject(),我们可以获得当前正在执行的 Subject. Subject是个安全术语,它基本上的意思是 “当前正在执行的用户的特定的安全视图”。它并没有被称为"User"是因为"User"一词通常和人类相关联。在安全 界,术语" Subject"可以表示为人类,而且可是第三方进程, cron job, daemon account,或其他类似的东西。它仅仅 意味着“该事物目前正与软件交互”。对于大多数的意图和目的,你可以把 Subject看成是 Shiro的"User"概念。 getsubject(在一个独立的应川程序中调川,可以返国个在应用程序特定位置的基于用户数据的 Subject,并且在服 务器环境中(例如,web应用程序),它取的 Subject是基亍关联了当前线程或传入请求的用户数据的 现在你拥有了一个 Subject,你能拿它来做什么? 如果你想在应用程序的当前会话中使事物对于用户可用,你可以获得他们的会话 Session session currentUser. getSession O session, setAttribute( someKey , avalue Session是个 Shiro的特定实例,它提供了大部分你经常与 Httpsessoins使用的东西,除了些额外的好处以及 个巨大的区别:它不需要一个HTP环境 如果在一个web应用程序内部部署,默认的 Session将会是基亍 Httpsession的。但,在一个非Web环境中,像这 个简单的教程应用程序, Shiro将会默认自动地使用它的 Enterprise Session Management。这意味着你会使用相同的 AP在你的应用程序,在任何层,不论部署环境!这丌辟」应川程序的新世界,山于任何需要会话的应用程序不必 再被强制使用 Httpsession或E」 B Stateful session beans。并且,任何客户端技术现在能够共享会话数据。 因此,现在你能获取一ˆ Subject以及他们的 Session。如果他们被允许做某些事,如对角色和权限的检查,像“检 查”真正有用的地方在哪呢? 嗯,我们只能为一个已知的用户做这些检查。我们上面的 Subject实例代表了当前用户,但谁又是当前用户?呃, 他们是匿名的——也就是说,直到直到他们至少登录一次。那么,让我像下面这样做: if(currentUser. isAuthenticatedo)I //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 UsernamePasswordToken token new UsernamePasswordToken(lonestarr,vespa) //this is all you have to do to support remember me (no config- built in!): oken. setRememberMe(true) currentUser login(token) 这就是了!它再简单不过了。 但如果他们的登录尝试失败了会怎样?你能够捕获各种具体的异常米告诉你到底发生了什么,并允许你去处理并作 出相应反应: //if no exception, that' s it, were done! ://username wasn't in the system, show them an error message? I catch Incorrect CredentialsException ice) //password didnt match, try again? I catch LockedAccount Exception lae )i //account for that username is locked- cant login. Show them a message? more types exceptions to check if you want I catch AuthenticationException ae ) i //unexpected condition- error? 你能够检査到许多不同类型的异常,或抛出你自己的自定义条件的异常—— Shiro可能不提供的。请参见 Authentication Exception JavaDoc获取更多。 Handy hint 最安仝的做法是给普通的登录尖败消息给用户,因为你当然不想帮助试图闯入你系统的攻击者。 好了,到现在为止,我们已经有了一个登录用户。我们还能做些什么? 比方说,他们是是谁: :log. info("User [' currentUser getPrincipalo+"] logged in successfully."): 我们也可以测试他们是否有特定的角色 ) if currentUser hasRole("schwartz")) log. info( May the Schwartz be with you!") t else t log. info("Hello, mere mortal.") 我们还可以判断他们是否有权限在一个确定类型的实体上进行操作: if currentUser isPermitted("lightsaber: weild"))I log. info( You may use a lightsaber ring. Use it wisely. y else i log. info( Sorry, lightsaber rings are for schwartz masters only. 当然,我们可以执行极其强大的实例级权限检查—一判断川)是否有能力访问某一·类型的特定实例的能力: l if currentUser isPermitted(winnebago: drive: eagles"))i log. info( You are permitted to 'drive' the winnebago' with license plate (id) eagles. Here are the keys- have fun!) I else t log. info(" Sorry, you aren't allowed to drive the eagles winnebago!") 小菜·碟,对吧? 最后,当用户完成了对应用程序的使用,他们可以注销 currentUser logout O: //removes all identifying information and invalidates their session tho Final tutorial class 在添加上面的示例代码后,下面是我们的最终 Tutorial类文件。请随意编辑和操作它,并按你喜欢的方式改变安全 检查(以及|N配置) Final src/main/java/ Tutorial j a import org. apache shiro. SecurityUtils import org. apache shiro. auth. import org. apache shiro. config. Ini Security Manager Factor import org. apache shiro. mgt. SecurityManager import org. apache shiro. session Session; import org. apache shiro. subject Subject import o che shiro, util. factor import org. slf4j Logger; import org. slf4j Logger Factory public class Tutorial t private static final transient Logger log= Logger Factory. getLogger(Tutorialclass public static void main(String[] args)i log. info My First Apache Shiro application ") Factory<Security Manager> factory new IniSecurity ManagerFactory classpath: shiro: ini") Security Manager securityManager =factory getInstance Security Utils. setSecurity Manager(securityManager); //get the currently executing user Subject currentUser SecurityUtils getsubject( //Do some stuff with a Session( no need for a web or EjB container Sessionsession currentUser getSession( session. setAttribute someKey"avalue") String value = String)session. getAttribute("somekey ) if (value. equals(avalue)) log. info( Retrieved the correct vlaue![ +vlaue +]") //let's login the current user so we can check against roles and permissions if (IcurrentUser. isAuthenticatedo) Username Password Token token =new UsernamePasswordToken("lonestarr,"vespa"); token. setRememberMe(true try currentUser login(token) 3 catch(UnknownAccountException uae)[ log. info " There is no user with username of + token. getprincipal() 3 catch(IncorrectCredentials Exception icet log. info" Password for account +token. getPrincipal0+was incorrect! ) y catch(LockedAccount Exception lae)i log. info( the account for username" +token getPrincipal(+is locked Please contact your administrator to unlock it. . catch more exceptions here(maybe custom ones specific to your application? catch (Authentication Exception ae) //unexpected condition? error?

...展开详情
试读 92P Shiro 开发文档中文版
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚积分or赚钱
最新推荐
Shiro 开发文档中文版 14积分/C币 立即下载
1/92
Shiro 开发文档中文版第1页
Shiro 开发文档中文版第2页
Shiro 开发文档中文版第3页
Shiro 开发文档中文版第4页
Shiro 开发文档中文版第5页
Shiro 开发文档中文版第6页
Shiro 开发文档中文版第7页
Shiro 开发文档中文版第8页
Shiro 开发文档中文版第9页
Shiro 开发文档中文版第10页
Shiro 开发文档中文版第11页
Shiro 开发文档中文版第12页
Shiro 开发文档中文版第13页
Shiro 开发文档中文版第14页
Shiro 开发文档中文版第15页
Shiro 开发文档中文版第16页
Shiro 开发文档中文版第17页
Shiro 开发文档中文版第18页
Shiro 开发文档中文版第19页

试读结束, 可继续读1页

14积分/C币 立即下载 >