shiro(3)-shiro核心

身份认证


身份认证分三个步骤

1)提交主题和凭据

2)进行身份认证

3)判断是通过,重新提交还是不通过

验证顺序


1)调用subject的login方法,提交主体和凭据。

2)得到对应操作的Security Manager

3)通过Sceurity Manager得到对应的Autherticator实例

4)根据配置策略查找对应的桥信息

5)通过桥信息到对应的配置处理进行身份验证

验证器

如果你想配置一个自定义的验证器

可以在配置文件中使用

[main]
...
authenticator = com.foo.bar.CustomAuthenticator

securityManager.authenticator = $authenticator

配置策略信息

AtLeastOneSuccessfulStrategy 如果一个验证成功,则验证结果为成功

FirstSuccessfulStrategy 只有第一个成功,才算成功

AllSuccessfulStrategy 所有的都必须成功

对应的在配置文件中的策略使用如下

shiro.ini

[main]
...
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy

securityManager.authenticator.authenticationStrategy = $authcStrategy

...

执行顺序

1)隐式顺序

blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm

按上下顺序执行

2)指定顺序

blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm

securityManager.realms = $fooRealm, $barRealm, $blahRealm
...

按指定的顺序执行

授权


控制谁有权限访问应用程序

授权的几个要素:权限,角色和用户。

三种权限的判断方式

1)编程

角色判断

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.hasRole("administrator")) {
 //show the admin button
} else {
 //don't show the button? Grey it out?
}

hasRole(String roleName) 主题是否已分配给指定的角色

hasRoles(List<String> roleNames) 是否包含指定的角色

hasAllRoles(Collection<String> roleNames) 是否包含指定的所有角色

角色断言

Subject currentUser = SecurityUtils.getSubject();

//guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();

checkRole(String roleName) 断言是否是指定角色

checkRoles(Collection<String> roleNames) 断言是否包含以下角色

checkRoles(String... roleNames) 断言是否包含所有角色

如果判断指定用户是否有权限访问指定名称的打印机

那么就会用到下列几个方法

Permission printPermission = new PrinterPermission("laserjet4400n", "print");

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted(printPermission)) {
 //show the Print button
} else {
 //don't show the button? Grey it out?
}

isPermitted(Permission p) 判断主题是否允许执行一个动作

isPermitted(List<Permission> perms) 是否允许执行一组动作

isPermittedAll(Collection<Permission> perms) 是否允许执行所有动作

基于字符串的权限检查

Subject currentUser = SecurityUtils.getSubject();

if (currentUser.isPermitted("printer:print:laserjet4400n")) {
 //show the Print button
} else {
 //don't show the button? Grey it out?
}

也可以如下使用

Subject currentUser = SecurityUtils.getSubject();

Permission p = new WildcardPermission("printer:print:laserjet4400n");

if (currentUser.isPermitted(p) {
 //show the Print button
} else {
 //don't show the button? Grey it out?
}

权限断言类似于角色断言。

2)annocation方式

The RequiresAuthentication annotation

@RequiresAuthentication
public void updateAccount(Account userAccount) {
 //this method will only be invoked by a
 //Subject that is guaranteed authenticated
 ...
}

等同于下述代码

public void updateAccount(Account userAccount) {
 if (!SecurityUtils.getSubject().isAuthenticated()) {
 throw new AuthorizationException(...);
 }

 //Subject is guaranteed authenticated here
 ...
}

The RequiresGuest annotation

@RequiresGuest
public void signUp(User newUser) {
 //this method will only be invoked by a
 //Subject that is unknown/anonymous
 ...
}

等同于

public void signUp(User newUser) {
 Subject currentUser = SecurityUtils.getSubject();
 PrincipalCollection principals = currentUser.getPrincipals();
 if (principals != null && !principals.isEmpty()) {
 //known identity - not a guest:
 throw new AuthorizationException(...);
 }

 //Subject is guaranteed to be a 'guest' here
 ...
}

The RequiresPermissions annotation

@RequiresPermissions("account:create")
public void createAccount(Account account) {
 //this method will only be invoked by a Subject
 //that is permitted to create an account
 ...
}

等同于

public void createAccount(Account account) {
 Subject currentUser = SecurityUtils.getSubject();
 if (!subject.isPermitted("account:create")) {
 throw new AuthorizationException(...);
 }

 //Subject is guaranteed to be permitted here
 ...
}

The RequiresRoles permission

@RequiresRoles("administrator")
public void deleteUser(User user) {
 //this method will only be invoked by an administrator
 ...
}

等同于

public void deleteUser(User user) {
 Subject currentUser = SecurityUtils.getSubject();
 if (!subject.hasRole("administrator")) {
 throw new AuthorizationException(...);
 }

 //Subject is guaranteed to be an 'administrator' here
 ...
}

The RequiresUser annotation

@RequiresUser
public void updateAccount(Account account) {
 //this method will only be invoked by a 'user'
 //i.e. a Subject with a known identity
 ...
}

等同于

public void updateAccount(Account account) {
 Subject currentUser = SecurityUtils.getSubject();
 PrincipalCollection principals = currentUser.getPrincipals();
 if (principals == null || principals.isEmpty()) {
 //no identity - they're anonymous, not allowed:
 throw new AuthorizationException(...);
 }

 //Subject is guaranteed to have a known identity here
 ...
}

授权顺序


1)应用程序调用主题,判断hasRole,isPermitted得到角色或者用户权限的列表。

2)组成对应的授权方法

3)协调如何授权

4)通过桥进行各种方式的授权

web应用

配置web.xml

<listener>
 <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

...

<filter>
 <filter-name>ShiroFilter</filter-name>
 <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
 <filter-name>ShiroFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

如果你愿意你可以自定义一个web应用

<context-param>
 <param-name>shiroEnvironmentClass</param-name>
 <param-value>com.foo.bar.shiro.MyWebEnvironment</param-value>
</context-param>

如果你想改变shiro.ini的位置,那么你可以指定

<context-param>
 <param-name>shiroConfigLocations</param-name>
 <param-value>YOUR_RESOURCE_LOCATION_HERE</param-value>
</context-param>

shiro.ini中的[urls]配置

例如:

...
[urls]

/index.html = anon
/user/create = anon
/user/** = authc
/admin/** = authc, roles[administrator]
/rest/** = authc, rest
/remoting/rpc/** = authc, perms["remote:invoke"]

假如你有如下设置


/account/** = ssl, authc

/account下的任何应用程序都将触动ssl和authc链

时间: 2024-11-03 21:36:06

shiro(3)-shiro核心的相关文章

Apache Shiro 关于Shiro 授权

授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限.  如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等.  一.授权的三要素  授权有着三个核心元素:权限.角色和用户.  权限 权限是Apache Shiro安全机制最核心的元素.它在应用程序中明确声明了被允许的行为和表现.一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限. 大多数的资源会支持典型的CRUD操作(create,read,update,delete),但

【Shiro】Shiro从小白到大神(一)-Shiro入门

本系列是我在学习Shiro的路上的笔记,第一篇是属于非常入门级别的. 首先是介绍了下shiro,然后进行了一个小例子进行实际的操作 本节操作不涉及数据库,只是文本字符操作认证 Shiro简介: 百度百科上的介绍: Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用.移动应用到大型网络及企业应用. Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保

【Shiro】Shiro从小白到大神(三)-权限认证(授权)

本节讲权限认证,也就是授权 基于角色的访问控制和基于权限的访问控制的小实例 以及注解式授权和JSP标签授权详解 权限认证 权限认证核心要素 权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源 在权限认证中,最核心的三个要素是:权限,角色和用户 (资源也算一个要素,但不是最核心的) 权限,即操作资源的 权限,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利(整合以后,其实就是一些对URL请求的权限) 角色,是权限的集合,一种角色可以包含多种权限(将权限赋给角色) 用户,在

Shiro Review——Shiro介绍

一,Shiro整体介绍             shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权.   spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单. shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro.   使用shiro实现系统 的权限管

shiro初步 shiro认证

什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单. shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro. 使用shiro实现系统 的权限管理,有效提高开发效率,从而降低开发成本

shiro授权-shiro的Testing怎么用?

问题描述 shiro的Testing怎么用? dao层: if(SecurityUtils.getSubject().hasRole("role_case_agent")){ buf.append("SELECT * FROM (SELECT t1.*, t2.receive_document_num, t2.case_title, t3.agent_department, t4.department_id FROM borrow_management_audit_info

shiro初步 shiro授权

授权流程 三种授权方法 Shiro 支持三种方式的授权: 编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) { //有权限 } else { //无权限 } 注解式:通过在执行的Java方法上放置相应的注解完成: @RequiresRoles("admin") public void hello() { //有权限 }

【Shiro】Shiro从小白到大神(二)-Subject认证结合MySQL

上一节博客讲的文本数据验证,基本不会在项目中用到,只是方便用来学习和测试 在本节,进行简单的数据库安全验证实例 Subject认证主体 Subject认证主体包含两个信息: Principals: 身份,可以是用户名,邮件,手机号码等等,只要能用来标识一个登陆主体身份的东西都可以 Credentials: 凭证(比如你说你叫张三,你凭什么说叫张三,你这个时候会拿出身份证说你就是叫张三,这个凭证和身份证差不多),常见有密码,数字证书等等 认证流程 细节可以自己去官网链接查看: http://shi

Shiro权限框架简介

       最近加入了gxpt项目组,被安排做权限模块,所以也有幸第一次接触到了Shiro框架.让我们来一起领略Shiro的风采吧. 什么是Apache Shiro?        Apache Shiro(发音为"shee-roh",日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用.移动应用到大型网络及企业应用.        你可以用 Apache Shiro