1. Overview
对于web应用,Shiro提供了认证和授权的过滤器实现。
2. Architecture
a. ServletContextSupport
提供了对ServletContext访问的支持。
b. AbstractFilter
提供了对过滤器初始化的配置。如果想在过滤器初始化时添加逻辑,可通过覆写onFilterConfigSet方法。
c. NameableFilter
提供了重命名过滤器的单一功能。过滤器默认的名字为web.xml中配置的filter-name,可通过NameableFilter的name属性设置一个新的名字。
d. OncePerRequestFilter
每次请求,过滤器需要依次执行,OncePerRequestFilter保证了每次请求时,每个过滤器只执行一次。实际的业务逻辑,由子类通过doFilterInternal方法实现。
e. AdviceFilter
覆写了OncePerRequestFilter的doFilterInternal方法,将过滤操作细化为前置处理,后置处理以及清理操作。只有前置方法preHandle返回true时,才会调用下一个过滤器。
f. PathMatchingFilter
支持Ant风格路径匹配。如果请求的路劲与配置的路径匹配,由onPreHandle方法决定该请求将如何处理。对于过滤器AnonymousFilter的实现,onPreHandle方法总是返回true。对于过滤器AccessControlFilter,需要由isAccessAllowed和onAccessDenied方法共同决定。所有的认证和授权过滤器都继承AccessControlFilter类。
3. Authentication Filters
AuthenticationFilter为所有认证过滤器的基类,默认的isAccessAllowed方法返回subject.isAuthenticated的值。也就是说,如果请求的路径配置了authc过滤器,需要当前的subject被认证过。如果当前的subject没有被认证过,不同的实现,执行的操作有所不同。BasicHttpAuthenticationFilter实现会根据请求的头信息自动执行一次认证操作,如果认证失败,请求返回401代码。FormAuthenticationFilter实现会根据当前的请求路径与登陆路径匹配,如果为登陆请求,尝试执行一次认证操作,如果不为登陆请求,请求调转到登陆页。
3.1 AnonymousFilter
AnonymousFilter主要用于那些不需要认证即可访问的资源。
[urls]
/user/signup/** = anon
/user/** = authc
对于/user/signup,任何用户都可以访问。对于/user/,需要当前的subject已认证过。
3.2 UserFilter
如果配置了UserFilter,表示请求的Subject已认证过或被"remember me"记忆:
[urls]
/news/**=user
对于/news/下的所有资源,只要用户登录过即可访问。
3.3 FormAuthenticationFilter
FormAuthenticationFilter需要当前的Subject必须被认证过,否则流程将跳转到设置的登陆url(通过setLoginUrl方法)。
[urls]
/news/**=authc
3.4 BasicHttpAuthenticationFilter
如果请求的Subject.isAuthenticated方法返回false,BasicHttpAuthenticationFilter将通过HTTP基础认证方式进行认证(关于HTTP基础认证,请查阅相关资料):
[urls]
/news/**=authcBasic
如果请求/news/,程序会执行Subject.isAuthenticated方法,如果返回false,执行HTTP基础认证。
4. Authorization Filters
AuthorizationFilter为所有授权过滤器的基类。默认的onAccessDenied方法中逻辑为,如果当前的Subject没有绑定任何标识信息,将请求转向登陆页面。如果Subject绑定了标识信息并且配置了unauthorizedUrl,请求将转向unauthorizedUrl,否则返回401代码。
4.1 PermissionsAuthorizationFilter
常用的AuthorizationFilter实现为PermissionsAuthorizationFilter,支持以权限的形式配置资源:
[urls]
/system/getUsers=perms[0]
如果请求的路径为/system/getUsers,需要当前的Subject具有权限"0"(调用subject的isPermitted或isPermittedAll方法),才允许访问资源,否则不允许访问。
4.2 RolesAuthorizationFilter
RolesAuthorizationFilter过滤器支持以角色的形式配置资源:
[urls]
/system/getUsers=roles[admin]
如果请求的路径为/system/getUsers,只有当前的Subject具有"admin"角色(调用subject的hasAllRoles方法),才允许访问资源,否则不允许访问。
4.3 PortFilter
PortFilter支持以端口的形式配置资源:
[urls]
/some/path/** = port
/another/path/** = port[8080]
如果请求的端口号与配置的资源映射端口号相同,则允许对资源进行访问。否则请求将被转向为对应资源映射端口的路劲。比如:如果请求地址为/another/path/test1,端口为9090,由于/another/path/test1需要8080端口才能够访问,那么请求将会被转向:http://localhost:8080//another/path/test1,亦即被转向了正确的url路劲。
4.4 HostFilter
HostFilter支持以主机的形式控制对资源的访问,Shiro1.1还没有完全实现对这种形式的支持。其isAccessAllowed方法将返回UnsupportedOperationException异常。
4.5 SslFilter
SslFilter支持以ssl的形式配置资源:
[urls]
/secure/getUser = ssl
如果要访问资源/secure/getUser,需要请求的地址相同且必须为https,端口为443才允许访问。
4.6 HttpMethodPermissionFilter
HttpMethodPermissionFilter支持以HTTP请求方法的方式配置资源。其内部将HTTP请求方法转义为对应的HTTP操作,对应关系如下:
head | read |
get | read |
put | update |
post | create |
mkcol | create |
options | read |
trace | read |
以下是一个例子:
[urls]
/user/** = rest[user]
如果使用GET方法访问/user/1234,由于GET方法对应着"read"操作,最后会转义为:Subject.isPermitted("user:read")。也就是说,当前的Subject必须具有user的read权限才允许对资源的访问。如果使用POST请求/user,会转义为Subject.isPermitted("user:create"),即当前Subject必须具有user的create权限。
- 大小: 51.3 KB
- 大小: 36 KB
- 大小: 42.6 KB
分享到:
相关推荐
Apache Shiro是一个强大的Java安全框架,它...此外,了解并正确配置Shiro的各个组件,如Realms(用于认证和授权的数据源)、Filters(处理HTTP请求的过滤器)和Cryptography(加密工具),是实现高效且安全应用的关键。
- **Filters**:Shiro 提供了一系列过滤器,如 `authc`(认证过滤器)、`perms`(权限过滤器)等,用于拦截请求并执行相应的安全逻辑。 **4. 示例项目中的关键组件** - **Web 应用**:可能使用 Spring Boot 集成 ...
- **Filters**:在Web应用中,Shiro通过一系列的过滤器来实现安全控制,如LoginFilter、AuthcFilter和RolesAuthorizationFilter。 - **配置**:理解如何在配置文件中设置Shiro的行为,如`shiro.ini`或Java配置。 在...
- **Filters(过滤器)**:Shiro通过一系列预定义的过滤器来实现其功能,如`authc`(认证过滤器)、`roles`(角色过滤器)、`perms`(权限过滤器)等。在`shiro.ini`或Spring配置文件中,需要定义过滤器链并映射URL...
### 安全框架Shiro详尽学习指南 #### 一、Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理等功能,可以非常容易地开发出足够安全的应用。Shiro的目标是帮助开发者更...
<property name="filters"> <!-- 自定义退出过滤器 --> /b/login = authc /b/logout = logout /b/** = user ``` 这里,`logout` 关键字对应的是 `systemLogoutFilter`,这意味着当用户访问 `...
- **Filters**: Shiro 提供了一系列过滤器,如 `authc`(认证)、`perms`(权限)、`roles`(角色)等,用于实现不同安全需求。 4. **Shiro 的身份验证和授权** - **身份验证(Authentication)**: 用户登录时,...
- **Filters**:Shiro通过Filter链进行请求拦截,实现权限控制。 3. **Shiro的配置**: - **shiro.ini或Java配置**:定义Subject的行为,包括Realm配置、安全约束等。 - **Web.xml配置**:设置Shiro Filter链,...
<property name="filters"> ``` 3. **自定义 Realm**: 在 Shiro 中,Realm 是负责与数据源交互的组件,通常用于验证用户凭证。由于 CAS 已经完成了密码验证,因此我们需要在自定义的 Realm 中不进行...
- **Filters**:Shiro通过过滤器链实现Web安全控制,这与Servlet容器的过滤器类似,可以在请求处理前或后执行特定的安全任务。 - **Session Management**:Shiro可以独立于Servlet容器管理会话,这对于非Web环境或...
在"课件"部分,你可能还会学习到如何配置Shiro的 Ini 配置文件,它是Shiro默认的配置格式,包含关于Subject、Realms、Filters等的设置。此外,可能会讲解到动态权限管理,例如如何在运行时根据业务需求动态调整用户...
<property name="filters"> <!-- 添加casFilter到shiroFilter --> /shiro-cas = casFilter /logout = logoutFilter /users/** = user ...
4. **配置Spring**:在Spring的配置文件(如`applicationContext.xml`)中,配置Shiro的Bean,包括`SecurityManager`、`FilterChainResolver`、`Filters`等。同时,通过`shiroFilter`将Shiro的过滤器链绑定到Spring ...
逐渐熟悉 SecurityManager、Subject、Realms、Filters 等关键组件的用法,最后再根据项目需求进行定制化配置。 总之,Apache Shiro 提供了一套全面的解决方案来处理应用安全问题,其简洁的 API 和丰富的功能使其...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,使得开发者能够轻松地实现和定制安全控制。在本资源中,我们有一个名为"Shiro简易实例:HelloWorld"的项目,它将引导你了解...
首先,Shiro的核心组件包括Subject、Realms、Caches、Filters等。Subject是Shiro的中心概念,代表了当前系统中的用户。Realms是Shiro与身份验证和授权信息源的桥梁,例如,我们可以创建一个连接到数据库的 Realm,...
首先,Shiro的核心组件包括Subject、Realms、Caches、Filters等。Subject是Shiro的中心概念,代表了当前用户的安全操作主体。Realms是Shiro获取认证和授权信息的数据源,可以对接数据库或其他数据存储。Caches用于...
- **Filters**:Shiro通过过滤器链来处理HTTP请求,实现身份验证和授权。 3. **Spring集成Shiro**: - **Spring Beans配置**:Shiro可以通过Spring的Bean配置进行管理,将 Realm、SecurityManager 等组件注入到...
5. **Web支持**:Shiro为Web应用提供了过滤器(Filters),可以轻松地集成到Servlet容器中,实现Web安全控制。 6. **简单API**:Shiro的API设计简洁,易于理解和使用,使得开发者能快速上手并实现安全功能。 7. **...
3. 创建安全组件:包括Subject、Realms(负责从数据源获取用户信息)、Filters(过滤器)等。 4. 集成Spring:通过Spring的Bean管理,将Shiro的组件声明为Spring Bean,实现依赖注入。 5. 配置Spring AOP:使用Shiro...