当前位置:首页 > 后端开发 > Shiro自定义过滤器

Shiro自定义过滤器

7个月前 (05-21)73

项目中需要所有首次登录的用户必须修改密码才可使用系统,项目采用的是Shiro框架。

突然想到了配置文件org.apache.shiro.spring.web.ShiroFilterFactoryBean中的loginUrl,校验未登录则跳转到登录地址。索性研究了它的源码后可以继承AccessControlFilter自定义自己的过滤器。

自定义Shiro过滤器:

package com.lwj.modules.filter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.StringUtils;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

import com.lwj.modules.shiro.realm.Principal;

/**
 * 首次登陆必须修改密码
 * 
 * @ClassName: ChangePasswordFilter
 * @author lwj
 * @version 1.0.0
 */
public class ChangePasswordFilter extends AccessControlFilter {

    /**
     * 登录地址
     */
    static final String LOGIN_URL = "/login.html";
    /**
     * 修改密码地址
     */
    static final String NEW_PASSWORD_URL = "/login/new_password.html";

    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
            throws Exception {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {

        Subject subject = getSubject(request, response);
        if (subject.getPrincipal() == null) {// 表示没有登录,重定向到登录页面
            saveRequest(request);
            WebUtils.issueRedirect(request, response, LOGIN_URL);
        } else {
            Principal principal = (com.lwj.modules.shiro.realm.Principal) subject.getPrincipal();
            if (principal.getChangedPassword() == null || !principal.getChangedPassword()) {
                if (StringUtils.hasText(NEW_PASSWORD_URL)) {// 如果首次登录未修改密码,则跳转到修改密码页面
                    WebUtils.issueRedirect(request, response, NEW_PASSWORD_URL);
                } else {
                    WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
                }
            }
        }
        return true;
    }

}

补充Principal类,这个类在登录的时候用于用户的认证,相当于保存当前登录用户的基本信息。

package com.lwj.modules.shiro.realm;

import java.io.Serializable;

/**
 * 
 * @Description :身份信息
 * @author : lwj
 * @version : 1.0.0
 * @Date :2016-11-13 11:21:56
 */
public class Principal implements Serializable {

    /** 用户Cookie名称 */
    public static final String USER_COOKIE_NAME = "u_c_n";

    /** "身份信息"参数名称 */
    public static final String PRINCIPAL_ATTRIBUTE_NAME = Principal.class.getName() + ".PRINCIPAL";
    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    /** ID */
    private Integer id;

    /** 用户名 */
    private String username;/**
     * 角色ID
     */
    private Integer roleId;
  /**
     * 登录IP
     */
    private String ip;/**
     * 第一次登陆是否修改密码(平台)
     */
    private Boolean changedPassword;

    /**
     * @param id
     *            ID
     * @param username
     *            用户名
     */
    public Principal(Integer id, String username,Boolean changedPassword, Integer roleId, String ip) {
        this.id = id;
        this.username = username;
    
this.changedPassword = changedPassword; this.roleId = roleId;
    
this.ip = ip; } /** * 获取ID * * @return ID */ public Integer getId() { return id; } /** * 设置ID * * @param id * ID */ public void setId(Integer id) { this.id = id; } /** * 获取用户名 * * @return 用户名 */ public String getUsername() { return username; } /** * 设置用户名 * * @param username * 用户名 */ public void setUsername(String username) { this.username = username; } public Integer getRoleId() { return roleId; } public void setRoleId(Integer roleId) { this.roleId = roleId; }
   
public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; }

  public Boolean getChangedPassword() { return changedPassword; } public void setChangedPassword(Boolean changedPassword) { this.changedPassword = changedPassword; } }

 

配置shiro.xml

  <!-- 自定义shiro的filter -->
    <bean id="changedPassword" class="com.lwj.modules.filter.ChangePasswordFilter" />
    
    <!-- shiroFilter -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- Shiro的核心安全接口,这个属性是必须的 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 要求登录时的链接 -->
        <property name="loginUrl" value="/login.html" />
        <!-- 登录成功后要跳转的链接 -->
        <property name="successUrl" value="/" />
        <!-- 用户访问未对其授权的资源时,所显示的链接 -->
        <property name="unauthorizedUrl" value="/common/unauthorized.html" />
        
        <property name="filterChainDefinitions">
            <value><!-- 用户首次登录必须修改密码 -->
                /index/* = changedPassword
                /navigation/* = authc,changedPassword
                /** = authc
            </value>
        </property>
        <property name="filters">
            <map>
                <entry key="changedPassword" value-ref="changedPassword" />
            </map>
        </property>
    </bean>

 

作者:Vincent-Li
来源链接:https://www.cnblogs.com/lyxy/p/6694387.html

标签: Shiro

“Shiro自定义过滤器” 的相关文章

SpringBoot集成Apache Shiro

SpringBoot集成Apache Shiro

笔者因为项目转型的原因,对Apache Shiro安全框架做了一点研究工作,故想写点东西以便将来查阅。之所以选择Shiro也是看了很多人的推荐,号称功能丰富强大,而且易于使用。实践下来的...

shiro权限认证与授权

shiro权限认证与授权

什么是shiro? Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框...

shiro登录认证过程讲解

shiro登录认证过程讲解

    先粘出登录的...

shiro框架总结

shiro框架总结

一、概念 shiro是一个安全框架,主要可以帮助我们解决程序开发中认证和授权的问题。基于拦截器做的权限系统,权限控制的粒度有限,为了方便各种各样的常用的权限管理需求的实现,,我们有...

Apache Shiro系列教程之三:Shiro的结构

Apache Shiro系列教程之三:Shiro的结构

Shiro的设计目标是简化应用的安全管理工作。软件通常是以用户为基础设计的。也就是说,我们经常是根据用户是怎样和我们的软件交互的来设计相关的用户接口。比如,你可能会说“如果是已经登录的用...

Shiro授权及注解式开发

Shiro授权及注解式开发

目的:   shiro授权   shiro注解式开发 Shiro授权   首先设计shiro权限表:   从图中我们也清晰的看出五张表之间的关系...

Shiro安全框架整理

 Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点: 简单的身份认证(登录),支持多种数据源(...

shiro源码篇

shiro源码篇

开心一刻   开学了,表弟和同学因为打架,老师让他回去叫家长   表弟硬气的说:不用,我打得过他   老师板着脸对他说:和你打架的那位同学已经回去叫家长了   表...

shiro(java安全框架)

shiro(java安全框架)

shiro(java安全框架)       以下都是综合之前的人加上自己的一些小总结     Apache Shiro是一个强大且易...

Apache Shiro入门实例

Apache Shiro入门实例

Shiro是一个强大灵活的开源安全框架,提供身份验证、授权、会话管理、密码体系。     1.先创建一个Maven项目  ...