文档章节

JFinal+shiro整合及demo

罗曼蒂克瑟尔
 罗曼蒂克瑟尔
发布于 2015/12/25 16:42
字数 756
阅读 382
收藏 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
博文 9
码字总数 6570
作品 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
JFinal+Shiro能否再简便些?

@JFinal 你好,想跟你请教个问题: 最近关注Shiro,感觉它的身份、权限的认证很不错。 找到JFinal的shiroplugin,不过感觉还是有那么一点复杂,请使用过此插件的同学都分享下感受呢~ ///////...

车开源
2014/04/03
3.5K
4
kft-activiti-demo 1.13.0 发布,Activiti 快速入门 Demo

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

咖啡兔
2015/11/25
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

get和post详解

get和post是表单提交的两种方式,get请求数据通过域名后缀URL传送,用户可见,不安全,post请求数据通过在请求报文正文里传输,相对比较安全。get是通过URL传递表单值,post通过URL看不到表单...

青衣霓裳
17分钟前
0
0
linux-如何快速替换IP

在Linux在做高可用的时候,经常会使用到虚拟IP。在windows上一个网卡可以配置两个IP,在Linux直接使用ip命令就可以添加了。 添加 ip address add 192.168.1.200/24 broadcast 192.168.1.255 ...

Linux就该这么学
22分钟前
0
0
Unix-Linux 编程实践教程 第五章 小结

设备文件中用逗号连接起来的两个数字为主设备号和从设备号。主设备号确定实际的设备驱动程序,从设备号作为参数。 如下图中的,主设备号-4,从设备号-2 设备文件中的i-node存储的是指向内核子...

Explorer0
25分钟前
0
0
virtual box centos7 挂载进行文件和共享使用说明

一、virtualbox共享文件夹无访问权限问题解决方法 (转载 http://www.cnblogs.com/zhuguanhao/p/6192777.html) 这篇文章主要介绍了virtualbox共享文件夹无访问权限问题解决方法,造成这个问题...

mbzhong
27分钟前
0
0
Rabbitmq---消息队列

一 . MQ:message queue   消息队列的作用:   1 通信解耦   2 高峰限流 原理分析: 一开始,认证系统是强耦合的,A系统传递认证系统消息接收计算结果的过程中   1 传给认证系统   2 认...

Ala6
32分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部