JFinal+shiro整合及demo

  本次整合基于玛雅牛提供的方法,先看一下这个 http://my.oschina.net/myaniu/blog/137205

 1、顶一个routes成员变量,并配置一些常量。

public class MainConfig extends JFinalConfig {
    
     Routes routes;
    /**
     * 配置常量
     */
    public void configConstant(Constants me) {
        // 加载少量必要配置,随后可用PropKit.get(...)获取值
        PropKit.use("a_little_config.txt");
        me.setDevMode(PropKit.getBoolean("devMode", false));
        me.setViewType(ViewType.FREE_MARKER);
        me.setBaseViewPath("/WEB-INF/view/");
        
    }

2、配置路由,插件,拦截器

/**
     * 配置路由
     */
    public void configRoute(Routes me) {
        this.routes = me;
        me.add("/", IndexController.class);    // 第三个参数为该Controller的视图存放路径
        me.add("/login", LoginController.class,"/");            // 第三个参数省略时默认与第一个参数值相同,在此即为 "/login"
    }
    
    /**
     * 配置插件
     */
    public void configPlugin(Plugins me) {
        // 配置C3p0数据库连接池插件
        C3p0Plugin c3p0Plugin = new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
        c3p0Plugin.setDriverClass("oracle.jdbc.driver.OracleDriver");
        me.add(c3p0Plugin);
        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
        me.add(arp);
        // 配置Postgresql方言 
        arp.setDialect(new OracleDialect());
        arp.setShowSql(true);
        arp.setContainerFactory(new CaseInsensitiveContainerFactory(true)); 
        arp.addMapping("test_user",User.class);    
        arp.addMapping("role","roleid",Role.class);    
        arp.addMapping("permission","perid",Permission.class);    
        arp.addMapping("menu","menuid",Menu.class);    
        arp.addMapping("user_role",UserRole.class);    
        arp.addMapping("role_permission",RolePermission.class);    
        arp.addMapping("role_menu",RoleMenu.class);    
        //加载Shiro插件
        //me.add(new ShiroPlugin(routes));
        ShiroPlugin shiroPlugin = new ShiroPlugin(this.routes);
        shiroPlugin.setLoginUrl("/login/");
        shiroPlugin.setSuccessUrl("/login/main/");
        shiroPlugin.setUnauthorizedUrl("/login/");
        me.add(shiroPlugin);   
    }
    /**
     * 配置全局拦截器
     */
    public void configInterceptor(Interceptors me) {
        //shiro 拦截器
         me.add(new ShiroInterceptor());
    }

3、实现一个realm,认证和授权的部分如下:

/*得到授权信息*/
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        /*用户的角色*/
        Set<String> roleNames = new HashSet<String>();
        /*用户的权限*/
        Set<String> permissions = new HashSet<String>();
        /*得到登陆用户的用户名*/
        String username = (String) principals.getPrimaryPrincipal();
        /*根据用户名得到用户*/
        User user=userservice.findUserByName(username);
    
        /*根据用户id得到角色*/
        Role role=roleservice.findRoleByUserId(user.getBigDecimal("id").intValue());
        /*根据角色id得到权限*/
        List<Permission> list= permissionservice.findAllPermByRoleid(role.getBigDecimal("roleid").intValue());
        for(Permission per:list){
            permissions.add(per.getStr("pername"));
        }
        roleNames.add(role.getStr("rolename"));
        /*授权信息,设置角色和权限*/
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
        info.setStringPermissions(permissions);
        return info;
    }
    
    /*认证用户名和密码是否符合登陆条件*/
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
        /* 这里编写认证代码 */
        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
        /*根据用户名从数据库里查找用户*/
        User user = userservice.findUserByName(token.getUsername());
        
        /*查找到的用户与Token里面的用户进行比较  匹配则登陆成功,不匹配则登陆失败*/
        return new SimpleAuthenticationInfo(user.getStr("username"),
                user.getStr("password"), getName());
    }

4、配置shiro.ini文件 在WEB-IN路径下面:

[main]
#realm
myRealm = com.fpb.realm.MyRealm
securityManager.realm = $myRealm
authc=com.fpb.filter.MyAuthenticationFilter
authc.loginUrl = /login/
logout=com.fpb.filter.LogOutFilter
logout.redirectUrl = login.html

 
#cache
shiroCacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
shiroCacheManager.cacheManagerConfigFile = classpath:ehcache-shiro.xml
securityManager.cacheManager = $shiroCacheManager
 
#session
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionDAO.activeSessionsCacheName = shiro-activeSessionCache
sessionManager.sessionDAO = $sessionDAO
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 360000
 
#这里的规则,web.xml中的配置的ShiroFilter会使用到。
[urls]
/login/=anon
/login.html=anon
/**=authc
/login/logout=logout

5、数据库配置文件a_little_config.txt:

jdbcUrl =jdbc:oracle:thin:@127.0.0.1 :1521:orcl
user = ***
password =***
devMode = true

6、登录方法:

public  UserService userservice=Duang.duang(UserService.class);

    public static final String LOGIN_FAIL_URL="login.html";
    public static final String LOGIN_SUCC_URL="main.html";
    public void index() {
        
        //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
       /* String username="admin";
        String password="111";*/
        String username=getPara("username");
        String password=getPara("password");

        Subject subject = SecurityUtils.getSubject();
        ThreadContext.bind(subject);
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        
        try{
            subject.login(token);
            User user = userservice.findUserByName(token.getUsername());
            getSession().setAttribute("userInfo", user);
        }catch (Exception e) {
            getRequest().setAttribute("message", "账户密码不匹配!");
            render(LOGIN_FAIL_URL);
        }
        
      
    }

  7、项目整体的结构图:

JFinal+shiro整合及demo_第1张图片

这次就先贴上代码了  具体的流程就不多做介绍了,demo的链接地址如下:https://yunpan.cn/cujKdAjqWXKHL  访问密码 46be

你可能感兴趣的:(JFinal+shiro整合及demo)