Spring-mvc与shiro配置遇到的问题

第一次在项目里使用shiro,网上也搜到很多教程,然而我还是踩了两个坑。
第一个是验证失败,后来发现是数据库存的密码是md5加密的,从网上搜到的教程里有这样的一段配置:

<bean id="credentialsMatcher"
        class="com.zlms.realm.RetryLimitHashedCredentialsMatcher">
        <constructor-arg ref="cacheManager" />
        <property name="hashAlgorithmName" value="md5" />
        <property name="hashIterations" value="1" />
        <property name="storedCredentialsHexEncoded" value="true" />
        <!-- 最多尝试次数 默认 5 次 -->
        <property name="maxCount" value="3" />
</bean>

然后就想当然的以为它会帮我进行加密以后验证,但是没有生效,不知为何而。
手动加上这段代码:
UsernamePasswordToken token = new UsernamePasswordToken(username, MD5Util.getMD5(password), remember);
验证就通过了。

第二个是登录成功跳转的页面仍然被拦截,还需要登录,但是我明明已经登录了。从这段代码:

Subject subject = SecurityUtils.getSubject();
            subject.login(token);
            System.out.println("subject " + subject.isAuthenticated());
            System.out.println("remember " + subject.isRemembered());
            System.out.println("user " + subject.getPrincipal());

输出为:

subject true
remember false
user admin

应该也没问题。

过滤链我是这样配置的

        <property name="filterChainDefinitions">
            <value>
                /static/** = anon
                /unauthorized = anon
                /login = anon
                /logout = logout
                /admin/** =user
            </value>
        </property>

当我把user换成anon,跳转就成功了,但是就达不到拦截管理页面的目的了。因此问题一定出在身份验证里。

我又加了一个过滤器

    <bean id="userFilter"
        class="com.zlms.realm.MyUserFilter">
    </bean>
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login" />
        <property name="unauthorizedUrl" value="/loginl" />
        <property name="filters">
            <util:map>
                <entry key="authc" value-ref="formAuthenticationFilter" />
                <entry key="user" value-ref="userFilter" />
            </util:map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /static/** = anon
                /unauthorized = anon
                /login = anon
                /logout = logout
                /admin/** =user
            </value>
        </property>
    </bean>

在MyUserFilter中:

@Override
    protected boolean isAccessAllowed(ServletRequest arg0, ServletResponse arg1, Object arg2) {
        // TODO Auto-generated method stub
        boolean isAllowed=super.isAccessAllowed(arg0, arg1, arg2);
        Subject subject = SecurityUtils.getSubject();
        System.out.println("allow  principal "+subject.getPrincipal());
        System.out.println("allow sub "+subject.isAuthenticated());
        System.out.println("allow principals "+subject.getPrincipals());
        return isAllowed;
    }

输出如下

allow  principal null
allow sub false
allow principals null

表示这里Subject和登录时的Subject不是同一个,或者内容被清空。

最后在检查web.xml时发现我的配置是

    <filter>  
        <filter-name>shiroFilter</filter-name>  
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
        <init-param>  
            <param-name>targetFilterLifecycle</param-name>  
            <param-value>true</param-value>  
        </init-param>  
    </filter> 
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

尝试把<url-pattern>/admin/*</url-pattern>修改为
<url-pattern>/*</url-pattern>
再一测试,竟然神奇的解决了那个困扰我三个小时的bug。

最后推测出现这种问题的原因。
由于我想把管理页面与前台页面分开,前台不需要做拦截,但是也有登录的功能,所以登录页面的路径设置为/login,后台页面的路径设置为/admin/*。然后我就想当然的在web.xml里设置成了
<url-pattern>/admin/*</url-pattern>
目的是只拦截后台页面。实际上这样会导致访问/login和/admin时subject不一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值