Apache Shiro Web应用整合-标签库

Apache Shiro 提供了一个JSP/GSP 标签库,它允许你控制你的JSPJSTL GSP 页面基于当前Subject的状态进行输出。这对于根据用户身份和当前用户的授权状态来提供个性化视图是相当有用的。

标签库的描述文件(TLD)保存在shiro-web.jar里的META-INF/shiro.tld文件。要使用任何标签,需要在你JSP 页面(或任何你定义的页面指令)的顶部添加下面一行:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

我们使用shiro 前缀用以表明shiro 标签库命名空间,当然你可以指定任何你喜欢的名字。

下面将分别介绍每一个标签,并展示它是如何用来渲染页面的。

The guest tag

guest 标签将显示它包含的内容,仅当当前的Subject 被认为是'guest'时。'guest'是指没有身份ID 的任何Subject。也就是说,我们并不知道用户是谁,因为他们没有登录并且他们没有在上一次的访问中被记住(RememberMe 服务)。例如:

<shiro:guest>

Hi there! Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a>today!

</shiro:guest>

guest 标签与user 标签逻辑相反。

The user tag

user 标签将显示它包含的内容,仅当当前的Subject 被认为是'user'时。'user'在上下文中被定义为一个已知身份IDSubject,或是成功通过身份验证及通过'RememberMe'服务的。请注意这个标签在语义上与authenticated 标签是不同的,authenticated 标签更为严格。例如:

<shiro:user>

Welcome back John! Not John? Click <a href="login.jsp">here<a> to login.

</shiro:user>

usre 标签与guest 标签逻辑相反。

The authenticated tag

仅仅只当当前用户在当前会话中成功地通过了身份验证authenticated 标签才会显示包含的内容。它比'user'标签更为严格。它在逻辑上与'notAuthenticated'标签相反。

authenticated 标签只有当当前Subject 在其当前的会话中成功地通过了身份验证才会显示包含的内容。它比user 标签更为严格,authenticated 标签通常在敏感的工作流中用来确保身份ID 是可靠的。例如:

<shiro:authenticated>

<a href="updateAccount.jsp">Update your contact information</a>.

</shiro:authenticated>

authenticated 标签与notAuthenticated 标签逻辑相反。

The notAuthenticated tag

notAuthenticated 标签将会显示它所包含的内容,如果当前Subject 还没有在其当前会话中成功地通过验证。例如:

<shiro:notAuthenticated>

Please <a href="login.jsp">login</a> in order to update your credit card information.

</shiro:notAuthenticated>

notAuthenticated 标签与Authenticated 标签逻辑相反。

The principal tag

principal 标签将会输出Subject 的主体(标识属性)或主要的属性。

若没有任何标签属性,则标签将使用principal toString()值来呈现页面。例如(假设principal 是一个字符串的用户名):

Hello, <shiro:principal/>, how are you today?

这一般等价于下面:

Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today?

principal 标签默认情况下,假定该principal 输出的是subject.getPrincipal()的值。但若你想输出一个不是主要principal的值,而是属于另一个Subject principal collection,你可以通过类型来获取该principal 并输出该值。

例如,输出Subject 的用户ID(并不是username),假设该ID 属于principal collection

User ID: <principal type="java.lang.Integer"/>

这一般等价于下面:

User ID: <%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString() %>

但如果该principal是一个复杂的对象而不是一个简单的字符串,而且你希望引用该principal 上的一个属性该怎么办呢?你可以使用property 属性来来表示property 的名称来理解(必须通过JavaBeans 兼容的getter 方法访问)。例如(假设principal 是一个User 对象):

Hello, <shiro:principal property="firstName"/>, how are you today?

这一般等价于下面:

Hello, <%= SecurityUtils.getSubject().getPrincipal().getFirstName().toString() %>, how are you today?

如果结合属性类型如下:

Hello, <shiro:principal type="com.foo.User" property="firstName"/>, how are you today?

这一般等价于下面:

Hello, <%= SecurityUtils.getSubject().getPrincipals.oneByType(com.foo.User.class).getFirstName().toString() %>, how are you today?

 

The hasRole tag

hasRole 标签将会显示它所包含的内容,仅当当前Subject 被分配了具体的角色。例如:

<shiro:hasRole name="administrator">

<a href="admin.jsp">Administer the system</a>

</shiro:hasRole>

hasRole 标签与lacksRole 标签逻辑相反。

The lacksRole tag

lacksRole 标签将会显示它所包含的内容,仅当当前Subject 未被分配具体的角色。例如:

<shiro:lacksRole name="administrator">

Sorry, you are not allowed to administer the system.

</shiro:lacksRole>

lacksRole 标签与hasRole 标签逻辑相反。

The hasAnyRole tag

hasAnyRole 标签将会显示它所包含的内容,如果当前的Subject 被分配了任意一个来自于逗号分隔的角色名列表中的具体角色。例如:

<shiro:hasAnyRole name="developer, project manager, administrator">

You are either a developer, project manager, or administrater.

</shiro:hasAnyRole>

hasAnyRole 标签目前还没有与之逻辑相反的标签。

The hasPermission tag

hasPermission 标签将会显示它所包含的内容,仅当当前Subject“拥有”(蕴含)特定的权限。也就是说,用户具有特定的能力。例如:

<shiro:hasPermission name="user:create">

<a href="createUser.jsp">Create a new User</a>

</shiro:hasPermission>

hasPermission 标签与lacksPermission 标签逻辑相反。

The lacksPermission tag

lacksPermission 标签将会显示它所包含的内容,仅当当前Subject 没有拥有(蕴含)特定的权限。也就是说,用户没有特定的能力。例如:

<shiro:lacksPermission name="user:delete">

Sorry, you are not allowed to deleted user accounts.

</shiro:hasPermission>

lacksPermission 标签与hasPermission 标签逻辑相反。

### 集成Shiro到Spring Boot项目 为了在Spring Boot中集成Shiro并使用`shiro-spring-boot-web-starter`,需遵循一系列配置步骤以确保安全框架能够正常工作。 #### 添加依赖项 首先,在项目的`pom.xml`文件里加入必要的Maven依赖。这包括用于简化集成过程的starter包: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.9.1</version> </dependency> ``` 此操作引入了所有必需的支持库以便于后续设置[^1]。 #### 数据源配置 接着,编辑`application.properties`或`application.yml`来指定连接至目标数据库的信息。这里给出的是基于YAML格式的一个例子: ```yaml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/shiro?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: yourpasswordhere mybatis: type-aliases-package: pojo mapper-locations: classpath:mapper/*.xml ``` 上述代码片段展示了如何声明数据源属性以及MyBatis的相关映射路径[^4]。 #### 自定义Realm实现类 创建继承自`AuthorizingRealm`的具体子类,负责处理认证逻辑和权限校验。下面是一份简单的模板代码: ```java import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; public class CustomRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 实现获取用户角色及权限的方法体... return null; // 返回具体的授权信息对象实例 } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 定义验证用户名密码或其他凭证的过程... return null; // 提供相应的认证详情记录给调用者 } } ``` 这段程序说明了怎样构建一个定制化的领域模型去适配特定业务需求下的访问控制机制[^2]。 #### 注册Bean组件和服务提供者接口(SPI) 最后一步是在应用程序启动期间注册之前定义好的realm bean以及其他任何可能需要的服务端点。通常情况下可以在主入口函数所在的类上添加如下静态内部类完成自动装配: ```java @Configuration public static class ShiroConfig { @Bean public Realm realm() { return new CustomRealm(); } /* 可选地调整默认行为 */ @Bean public SecurityManager securityManager(){ DefaultWebSecurityManager manager = new DefaultWebSecurityManager(realm()); return manager; } } ``` 以上就是关于如何利用`shiro-spring-boot-web-starter`快速搭建起一套基本的身份验证与授权体系的大致流程概述[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值