在BOS项目中应用shiro框架进行认证(登录认证)

原理介绍:

shiro框架认证流程

Application Code:应用程序代码,由开发人员负责开发的

Subject:框架提供的接口,代表当前用户对象

SecurityManager:框架提供的接口,代表安全管理器对象

Realm:可以开发人员编写,框架也提供一些,类似于DAO,用于访问权限数据

第一步:引入shiro框架相关的jar

<!-- 引入shiro框架的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.2.2</version>
        </dependency>

第二步:在web.xml中配置spring框架提供的用于整合shiro框架的过滤器

<!-- 配置过滤器,用于整合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> 

 启动tomcat服务器,抛出异常:spring工厂中不存在一个名称为“shiroFilter”的bean对象

第三步:在spring配置文件中配置bean,id为shiroFilter

<!-- 配置shiro框架的过滤器工厂对象 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 注入安全管理器对象 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 注入相关页面访问URL -->
        <property name="loginUrl" value="/login.jsp"/>
        <property name="successUrl" value="/index.jsp"/>
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
        <!--注入URL拦截规则 -->
        <property name="filterChainDefinitions">
            <value>
                /css/** = anon
                /js/** = anon
                /images/** = anon
                /validatecode.jsp* = anon
                /login.jsp = anon
                /userAction_login.action = anon
                /page_base_staff.action = perms["staff-list"]
                /* = authc
            </value>
        </property>
    </bean>

 框架提供的过滤器:

第四步:配置安全管理器

    <!-- 注册安全管理器对象 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm"/>
        <!-- 将缓存管理器注入安全管理器对象 -->
        <property name="cacheManager" ref="cacheManager"></property>
    </bean>

 第五步:修改UserAction中的login方法,使用shiro提供的方式进行认证操作

@Autowired
    private IUserService userService;
    
    /**
     * 用户登录
     */
    public String login(){
        //从Session中获取生成的验证码
        String validatecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
        //校验验证码是否输入正确
        if(StringUtils.isNotBlank(checkcode) && checkcode.equals(validatecode)){
            //输入的验证码正确
            //使用shiro框架提供的方式进行验证
            Subject subject = SecurityUtils.getSubject();       //获得当前登录用户,现在为未认证状态
            //用户名密码令牌
            AuthenticationToken token =
                    new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));
            try {
                subject.login(token);
            } catch (Exception e) {
                e.printStackTrace();
                this.addActionError("用户名或密码错误!");
                return LOGIN;
            }
            User user = (User) subject.getPrincipal();
            ServletActionContext.getRequest().setAttribute("loginUser", user);
            return HOME ;
        }else{
            //输入的验证码错误,设置提示信息,跳转到登录页面
            this.addActionError("输入的验证码错误!");
            return LOGIN;
        }
    }

 第六步:自定义realm,并注入给安全管理器

/**
 * 自定义realm,并注入给安全管理器
 * @author Administrator
 *
 */
public class BOSRealm extends AuthorizingRealm{

    @Autowired
    private IUserDao userDao ;
    @Autowired
    private IFunctionDao functionDao ;
    
    //认证方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //System.out.println("realm中的认证方法执行了。。。。");
        UsernamePasswordToken mytoken = (UsernamePasswordToken)token;
        String username = mytoken.getUsername();
        //根据用户名查询数据库中的密码
        User user = userDao.findUserByUsername(username);
        if(user == null) {
            //用户名不存在
            return null ;
        }
        //如果能查询到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致
        AuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),this.getName());
        return info;
    }
    
    //授权方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        info.addStringPermission("staff-list");
        
        //info.addStringPermission("");
        //TODO 以后修改为从数据库中查询
        return info;
    }

}

 在spring配置文件中注册ream

<!-- 注册realm -->
    <bean id="bosRealm" class="com.itheima.bos.bosrealm.BOSRealm">

 注入给安全管理器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值