如何使用Shiro实现不同用户登录成功后跳转到不同主页

 我来答
time陌言成殇
2014-12-21 · TA获得超过8.4万个赞
知道大有可为答主
回答量:1.4万
采纳率:91%
帮助的人:9148万
展开全部

您好,很高兴为您解答。

登陆成功后获取 Subject 对象. 
然后通过 Subject 对象来判断当前用户的角色/权限, 之后执行不同的跳转(直接在LoginAction中做)

登陆代码: 

UsernamePasswordToken token = new UsernamePasswordToken(name, password);  
  
try {  
    SecurityUtils.getSubject().login(token);  
      
    Subject subject = SecurityUtils.getSubject();  
                      // 这里可以调用subject 做判断  
  
    System.out.println("--------------------------------------------------------------");  
    Boolean isadmin = subject.hasRole("admin");  
    log.info("是否为管理员:"+isadmin);  
    System.out.println("--------------------------------------------------------------");  
      
    String userId = (String)subject.getPrincipal();  
    User user = userService.getById(userId);  
    ShiroUser shiroUser = shiroUserService.getByDyId(userId);  
               
    if(shiroUser == null){  
        this.addActionError(getText("login.failure"));  
        return ERROR;  
    }else{  
        int used = shiroUser.getUsed();  
        if(used == 1){  
            this.addActionError(getText("login.noused"));  
            return ERROR;  
        }  
    }  
      
      
    Session session = subject.getSession(true);  
    session.setAttribute(LoginAction.USER_KEY, user);  
    session.setAttribute(LoginAction.SHIRO_USER_KEY, shiroUser);  
      
    log.info("set workflow define to session");  
    session.setAttribute("ptDefine", WorkflowContext.getPtDefine());  
      
} catch (AuthenticationException e) {  
    log.info(e.getMessage());  
    this.addActionError(getText("login.failure"));  
}  
  
if (this.hasErrors()) {  
    log.info("login erro ...");  
    return ERROR;  
}


配置, 登陆跳转基本没用到, 注意 filterChainDefinitions, 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
    <property name="securityManager" ref="securityManager"/>  
    <!-- override these for application-specific URLs if you like: -->  
    <property name="loginUrl" value="/index.jsp"/>  
    <property name="successUrl" value="/home.jsp"/>  
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>   
    <!-- The 'filters' property is not necessary since any declared javax.servlet.Filter bean  -->  
    <!-- defined will be automatically acquired and available via its beanName in chain        -->  
    <!-- definitions, but you can perform instance overrides or name aliases here if you like: -->  
    <!-- -->  
    <property name="filters">  
        <map>  
            <entry key="authc">  
                   <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"/>  
               </entry>  
        </map>  
    </property>   
    <property name="filterChainDefinitions">  
        <value>           
            # static file chains  
            /js/* = anon  
            /css/* = anon  
            /img/* = anon  
            /images/* = anon  
            /applets/* = anon  
              
            # login/logout chain  
            /login.action = anon  
              
            # some example chain definitions:  
            #/admin/** = authc, roles[ptAdmin]  
            /docs/** = authc, perms[document:read]  
              
            /** = user  
            # more URL-to-FilterChain definitions here  
        </value>  
    </property>  
</bean>


如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!

                                                                                                                            ~ O(∩_∩)O~

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式