Shiro-初体验

Shiro: 一个易上手,设计灵活的权限框架, 通过简单的配置就能实现系统的安全管理. 


从系统的安全角度考虑, 你的系统至少需要实现如下功能: 

  1. 未登录的用户访问页面A时跳转至登录页面
  2. 用户登录成功后会自动跳转至页面A或指定页面
  3. 已经登录的用户可以直接访问页面B
  4. 普通会员不可以访问页面C
  5. 超级会员可以访问页面D

上述功能总结起来为两点:

  • 所访问页面是否需要登录
  • 是否有权限访问页面(权限是需要登录之后根据登录用户得到的)

Shiro给登录和权限定义了两个专有名词, 分别是认证(authc)和授权(authz). 

A,B,C三个页面需要登录用户访问, 其中: C页面需要有权限的用户才能访问. 在Shiro中可以说成只有认证用户才能访问A,B,C页面. 只有通过授权的用户才能访问页面C

系统的安全需求已经清晰了, 下面我们来配置Shiro, 本例中代码只进行基础配置, 深入内容后续讲到.

由于Spring已经一统天下, 本例中的Shiro全部基于Spring进行配置. 

1) 引入Shiro相关依赖, Spring下的Shiro需要三个类库: 

  • shiro-web.jar: 提供filter, session相关的类
  • shiro-core.jar: 核心包
  • shiro-spring.jar: spring整合必备
"org.apache.shiro:shiro-core:1.3.2",
"org.apache.shiro:shiro-web:1.3.2",
"org.apache.shiro:shiro-spring:1.3.2"

2)  Shiro配置文件

我们进行如下配置: 除/page/n外, 所有请求都需要认证(登录)才可以访问.

beans {

    // Shiro核心配置
    shiroFilter(ShiroFilterFactoryBean) {
        securityManager = ref("securityManager")
        // 配置URL规则
        // 有请求访问时Shiro会根据此规则找到对应的过滤器处理
        filterChainDefinitionMap = [
            "/page/n" : "anon", // /page/n不需要登录即可访问
            "/**": "authc" // 其余所有页面需要认证(authc为认证过滤器)
        ]
    }

    // 安全管理器
    securityManager(DefaultWebSecurityManager)

}

shiroFilter: 定义及配置shiro核心过滤器并交由Spring管理, 需要被Shiro管理的URL在访问时都经过该过滤器处理(下面会在web.xml进行配置), Shiro是基于过滤器实现的安全框架,  原理是URL与过滤器对应, 当访问URL时找到对应的过滤器, 在过滤器中处理认证和授权. Shiro内置了很多的过滤器, 下面介绍几个常用的过滤器:

  • anon: 匿名过滤器, 不进行任何认证和授权的处理, 所有不需要认证和授权(所有人都可以访问的页面)配置该过滤器, 例如: CSS, JS, 图片, 网站首页等. 对应类为org.apache.shiro.web.filter.authc.AnonymousFilter
  • authc: 表单认证过滤器, Shiro认证最核心的过滤器, 处理认证, 登录等操作, 所有需要认证才能访问的URL都需配置该过滤器, 后续篇幅会根据源码讲解该过滤器的实现原理及机制. 对应类为org.apache.shiro.web.filter.authc.FormAuthenticationFilter
  • logout: 登出过滤器, 一般登出的URL需要配置为logout, 当用户点击登出链接时进入该过滤器. 系统的登出操作交由Shiro处理. 对应类为org.apache.shiro.web.filter.authc.LogoutFilter

为方便记忆与配置,上述的过滤器都是简写, 在Shiro中有一个简写和实际过滤器类的对应关系, 具体其他过滤器的简写可以在代码中进行查看. 在org.apache.shiro.web.filter.mgt.DefaultFilter

    anon(AnonymousFilter.class),
    authc(FormAuthenticationFilter.class),
    authcBasic(BasicHttpAuthenticationFilter.class),
    logout(LogoutFilter.class),
    noSessionCreation(NoSessionCreationFilter.class),
    perms(PermissionsAuthorizationFilter.class),
    port(PortFilter.class),
    rest(HttpMethodPermissionFilter.class),
    roles(RolesAuthorizationFilter.class),
    ssl(SslFilter.class),
    user(UserFilter.class);

shiroFilter还可以配置: 

  • loginUrl: 登录页面请求地址, 默认为/login.jsp, 当访问请求的用户未登录时Shiro会重定向到该地址让用户进行登录.
  • successUrl: 用户直接访问登录页, 登录成功后跳转至此地址. 用户访问页面A时跳转至登录, 登录成功后会重定向至页面A.
  • unauthorizedUrl: 未授权页面地址, 未授权的用户页面时, Shiro会重定向到该页面提示用户无访问权限.

securityManager: Shiro安全管理器, 提供Shiro核心的安全管理逻辑, 后续篇幅细讲. 此处默认声明一下即可.

3)  Web.xml添加Shiro过滤器及Shiro配置文件

  • Shiro过滤器配置

上面提到了所有的URL都交由Shiro的过滤器进行处理, 因此需要在web.xml中添加shiro的过滤器

<filter>
	<filter-name>shiroFilter</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
	<filter-name>shiroFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-class>是Spring提供的代理类, 后续会讲到, <filter-name>一定要和Shiro配置文件中的名称相同才能找到对应的过滤器

  • shiro配置文件
<!-- Spring Context Listener -->
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
	<!-- groovy DSL -->
	<param-name>contextClass</param-name>
	<param-value>
		org.springframework.web.context.support.GroovyWebApplicationContext
	</param-value>
</context-param>
<context-param>
	<param-name>contextConfigLocation</param-name>
	<!-- Shiro configuration -->
	<param-value>classpath*:/spring-shiro.groovy</param-value>
</context-param>

本例代码使用了Spring4新增的Groovy DSL语法. 此处只是增加了Shiro配置文件. 无其他特殊配置


至此, 一个基于Shiro控制项目认证的示例配置完成, Shiro全部采用配置. 运行项目:

  • 访问/page/n, 可以正常访问.
  • 访问其他页面会跳转至登录.

示例代码地址: https://github.com/atd681/alldemo

猜你喜欢

转载自blog.csdn.net/weixin_42500670/article/details/81330624