文档章节

JFinal+shiro整合及demo

罗曼蒂克瑟尔
 罗曼蒂克瑟尔
发布于 2015/12/25 16:42
字数 756
阅读 364
收藏 15

  本次整合基于玛雅牛提供的方法,先看一下这个 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、项目整体的结构图:

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

© 著作权归作者所有

共有 人打赏支持
罗曼蒂克瑟尔
粉丝 4
博文 8
码字总数 6563
作品 0
昌平
程序员
求jfinal+shiro的demo

@JFinal 你好,想跟你请教个问题: 求jfinal+shiro的demo地址。。

lyleluo
2014/09/26
451
2
jfinal+shiro有哪位大侠实现了remember me功能

现在我这边开发基于jfinal+shiro的android手机端,想实现记住我的功能。这样用户只要不主动退出,以后进入android端就不需要再次登录了。但是记住我功能有点搞不定,有哪位大侠实现了并最好有...

hsongjiang1982
2015/04/10
493
2
jfinal shiro snaker quartz定时调用时发生的错误

@玛雅牛 你好,想跟你请教个问题: 我们的项目采用了jfinal+shiro,quartz来配置定时任务,snaker流程引擎。 其他的插件都是通过plugin的方式加载到jfinal,只有shiro通过filter配置而来。 使...

jiayaoyao
2016/12/02
387
3
kft-activiti-demo 1.13.0 发布,Activiti 快速入门 Demo

时隔一年再次更新,主要是针对Activiti 5.17+版本做了支持,自动初始化Demo数据等 Activiti Modeler从5.17开始结构和整合到项目的方式有些变化,另外官方Activiti Explorer整合的方式也有Spr...

咖啡兔
2015/11/25
1K
3
CSS Sprite(CSS贴图)

吐槽:oschina的markdown怎么这么丑? 我们经常看到这样的CSS描述: 其中的demo.png就是将多个小图像整合到一起的图片,目的是减少对资源请求次数。 那么怎么整和呢,除了图片处理的软件,这...

BlurNull
2016/02/24
53
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
2
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
35
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部