SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)

1、Shiro配置的简要说明。html

<!-- 項目自定义的Realm -->
    <bean id="shiroDbRealm" class="org.shiro.demo.service.realm.ShiroDbRealm" ></bean>
    
    <!-- Shiro Filter -->
    <bean id="shiroFilter"
        class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/" />
        <property name="successUrl" value="/system/main" />
        <property name="unauthorizedUrl" value="/system/error" />
        <property name="filterChainDefinitions">
            <value>
            /login = anon
            /validateCode = anon
            /** = authc
            </value>
        </property>
    </bean>

大体解释:
<bean id="shiroDbRealm" class="org.shiro.demo.service.realm.ShiroDbRealm" ></bean>
这个就是指定Shiro验证用户登陆的类为自定义的ShiroDbRealm.java。java

Shiro Filter当中:
securityManager:这个属性是必须的。
loginUrl :没有登陆的用户请求须要登陆的页面时自动跳转到登陆页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面web

successUrl :登陆成功默认跳转页面,不配置则跳转至”/”。若是登录前点击的一个须要登陆的页面,则在登陆自动跳转到那个须要登陆的页面。不跳转到此。
unauthorizedUrl :没有权限默认跳转的页面。
filterChainDefinitions : 就是须要验证的地址的列表,经常使用的包含anon、authc、perms、roles、user、logout。
/login = anon  表明后缀为/login的连接不验证
/** = authc   表明其它后缀的连接都进行登陆验证,需登陆后才能访问。spring

2、新建ShiroDbRealm类apache

package org.shiro.demo.service.realm;
import javax.annotation.Resource;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.shiro.demo.entity.User;
import org.shiro.demo.service.IUserService;

public class ShiroDbRealm extends AuthorizingRealm{

    @Resource(name="userService")
    private IUserService userService;

    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        return null;
    }

    /**
     *  认证回调函数,登陆时调用.
     */
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken authcToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
        User user = userService.getByAccount(token.getUsername());
        if (user != null) {
            return new SimpleAuthenticationInfo(user.getAccount(), user
                    .getPassword(), user.getNickname());
        } else {
            return null;
        }
    }
}

继承AuthorizingRealm类,且重写doGetAuthorizationInfo及doGetAuthenticationInfo方法。
doGetAuthorizationInfo : 验证当前Subject(可理解为当前用户)所拥有的权限,且给其受权。在下一章说明。
doGetAuthenticationInfo : 验证当前Subject登陆。
userService.getByAccount(token.getUsername());是自定义的方法。app

3、新建UserController.java类jsp

@Controller
public class UserController {
private static final Log log = LogFactory.getLog(UserController.class);
    
    /**
     * 判断用户是否登陆
     * @param currUser
     * @return
     */
    @RequestMapping(value = "/login",method=RequestMethod.POST)
    public String isLogin(User currUser){
        Subject user = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(currUser.getAccount(),currUser.getPassword());
        token.setRememberMe(true);
        try {
            user.login(token);
            return "redirect:/main";
        }catch (AuthenticationException e) {
            log.error("登陆失败错误信息:"+e);
            token.clear();
            return "redirect:/login";
        }
    }
}

4、新建login.jsp函数

<form action="<%=basePath%>/login" method="post">
    用户名:<input type="text" name="account"/> <br/>
    密码:<input type="text" name="password"/><br/>
    <input type="submit" value="登陆" />
</form>

而后经过SpringMVC访问到login.jsp页面,测试Shiro的用户验证。post

相关文章
相关标签/搜索