本次整合基于玛雅牛提供的方法,先看一下这个 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