spring-shiro登录认证通过后跳不到权限方法里面

流风回雪pj 发布于 2017/06/12 15:51
阅读 1K+
收藏 1

shiro.xml配置文件:

<!-- 启用shrio授权注解拦截方式 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 装配 securityManager -->
        <property name="securityManager" ref="securityManager" />
        <!-- 配置登陆页面路径 -->
        <property name="loginUrl" value="/toLogin" />
        <!-- 登陆成功后的页面路径 -->
        <property name="successUrl" value="/views/success.html" />
        <!-- 未通过授权跳转页面 -->
        <property name="unauthorizedUrl" value="/error/noperms.jsp" />
        <property name="filterChainDefinitions">
            <value>
                /success.html=authc
                /toLogin=anon
            </value>
        </property>
    </bean>

controller控制:

        @RequestMapping("/login")
	public String login(HttpServletRequest request, HttpServletResponse response) {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		UsernamePasswordToken token = new UsernamePasswordToken(username, password);
		
		Subject currentUser = SecurityUtils.getSubject();
		
		try {
			if (!currentUser.isAuthenticated()) {
				token.setRememberMe(true);
				currentUser.login(token);
			}
			return "success";
		} catch (AuthenticationException e) {
			e.printStackTrace();
			return "fail";
		}

自定义realm:

/**
	 * 授权
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		/*这里应该根据userName使用role和permission 的serive层来做判断,并将对应 的权限加进来,下面简化了这一步*/
		Set<String> roleNames = new HashSet<String>();
	    Set<String> permissions = new HashSet<String>();
	  //添加角色。对应到index.jsp
	    roleNames.add("admin");
	    roleNames.add("administrator");
	  //添加权限,对应到index.jsp
	    permissions.add("create");
	    permissions.add("login");
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
	    info.setStringPermissions(permissions);
		return info;
	}

	/**
	 * 认证
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
		UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
		System.out.println("username:"+token.getUsername());
		SysUser user = userService.findUserByName(token.getUsername());
		if (user != null) {
			return new SimpleAuthenticationInfo(user.getLoginName(), user.getPassword(), getName());
		}else {
			throw new AuthenticationException();
		}
	}

问题是:/login进入到方法里面后,调试可以看到进入了realm的认证方法,但是login方法执行结束也没有进入realm的授权方法里面,不知道是不是我的shiro.xml配置有问题

加载中
0
流风回雪pj
流风回雪pj

目前找到的结果是:controller的返回值是index时是会跳到权限方法里面

0
爱生活-爱美女
爱生活-爱美女

  

/login

你的shiro.xml  改成 /login = anon

当认证成功 return AuthenticationInfo后 shiro就会去执行授权  按你的说法 应该是登录失败了 执行了你的

throw new AuthenticationException()
流风回雪pj
流风回雪pj
登录没有失败,登录认证的方法执行完没有报错。只是跳不进去授权这个方法,但是我把success改成index的名称就可以进去了
0
battyman
battyman

配置有问题,改成:

        <property name="filterChainDefinitions">
            <value>
                /success.html=user
                /login=authc
            </value>
        </property>

 

battyman
battyman
回复 @流风回雪pj : 你的toLogin可能也是用于返回登录页面的,有全局的loginUrl那也可以不用配置/login=authc,但是authc就是不能配置在success.html上,原因就我上面说的
battyman
battyman
回复 @流风回雪pj : authc是用于拦截的,拦截器的目的是若没登录则跳转登录,其次是构造Token交于Token验证,就是你的那个“认证”方法
流风回雪pj
流风回雪pj
authc是需要登录认证后,/login是登录操作还没有认证怎么能用autho呢
返回顶部
顶部