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