Jeesite 二次开发-多用户登录Shiro模块

原创
2017/05/25 10:29
阅读数 2.6K

    此次二次开发将从头开始记录,开发顺序会从多用户模块入手,解决默认显示首页,前后台登录分离等问题。

问题难点

  • 默认首页的显示
  • Shiro权限模块的多用户登录验证等,较为复杂

数据库表

    本次使用的数据库为MySql,拓展数据库管理工具为Navicat。   

    在Jeesite搭建完成的基础上,首先从数据库表的建设开始,后台用户表已经有了,这里建立的是前台用户表,前后用户分离,参照后台用户表的字段信息,去掉了几个字段,且将Id主键修改为自增长的Int类型,不按照原始设定的UUID字符串,为了利用到自增长的排序功能。

前台用户表 front_user

配置文件

    Jeesite中已经集成代码生成模块,即通过依赖注入(DI-Dependency Injection)的方式,构建相关Java类文件,自动生成简单的增删查改功能。

    找到resources包下的jeesite.properties文件,简单设置以下几项,此次使用的mysql的配置。

  • jdbc.type 数据库类型
  • jdbc.driver 数据库驱动jar包
  • jdbc.url 数据库链接
  • jdbc.username 用户名
  • jdbc.password 密码
  • projectPath 该项为注释项,切换到Source模式去除注释后可显示,用于设置代码生成路径,指定为当前工程的所在物理路径

模块生成

    使用代码生成(GEN)模块,业务表配置。

    生成方案配置

    点击“保存并生成代码”后,会自动生成相应的代码模块,如果发现工程中没有出现,请到实际的物理路径下寻找一下,看看是不是jeesite.properties的projectPath路径设置错了,如果实际的物理路径中有而工程目录中没有,请点击工程右键 -> Maven4MyEclipse -> Update Project,更新后会出现,如下图。

    接着我们修改一下,将主键增长方式设置为自增长,打开FrontUserDao.xml,去掉insert方法中的id字段即可。(去掉即可将id增长方式从UUID转变为自增长,新手注意自动生成的UUID为字符串,在数据库字段中对应的varchar类型的,而自增长为int类型)

修改默认首页及前后台路径设置分析(标题位置暂定)

    提示,输入以下几个地址尝试访问:

  • http://localhost/项目名 (默认首页地址)
  • http://localhost/项目名/a (后台管理首页地址)
  • http://localhost/项目名/f (前台首页地址)

    输入“http://localhost/项目名”,会直接跳转到项目工程的默认首页,一般在web.xml中设定对应的首页,但这里通过spring-mvc.xml的81行可见设置,默认首页映射到jeesite.properties的web.view.index属性中,所以,我们直接配置这个属性就可以完成默认首页的设置。

<!-- 定义无Controller的path<->view直接映射 -->
<mvc:view-controller path="/" view-name="redirect:${web.view.index}"/>

    接下来,我们看一下原设定是什么,web.view.index属性原设定值为“/a”,“/a”是什么,它是“后台管理”路径的前缀路径,用来区分前后台的路径,我们在默认登录的时候会进入到“/a/login”的路径中,这个值“/a”对应的属性为jeesite.properties的“adminPath”,参照在controller层中类文件可见,映射路径@RequestMapping中必带“${adminPath}”参数,所以我们可以确定,凡是带了该参数的均为后台路径(jeesite.properties源代码模式下unicode编码已经有说明了)。

adminPath=/a
frontPath=/f
web.view.index=/a

    所以实际的流程是这样的,通过输入“http://localhost/项目名”地址访问,会跳转到web.view.index设定的首页地址(这里以原设定“/a”为例),所以访问的实际地址为“http://localhost/项目名/a”,而这个地址对应的controller层方法是在“com.thinkgem.jeesite.modules.sys.web.LoginController”类文件中,对应的方法为“index”。

/**
	 * 登录成功,进入管理首页
	 */
	@RequiresPermissions("user")
	@RequestMapping(value = "${adminPath}")
	public String index(HttpServletRequest request, HttpServletResponse response) {
}

    输入“http://localhost/项目名”或“http://localhost/项目名/a”会来到这个方法,但是打印输出发现并没有进来,而且最终地址为“http://localhost/项目名/a/login”,是因为在进入这个方法前要进行shiro权限校验,如果没通过是无法进入会跳转到指定的地址,参照对比spring-context-shiro.xml,即可发现。

<!-- Shiro权限过滤过滤器定义 -->
	<bean name="shiroFilterChainDefinitions" class="java.lang.String">
		<constructor-arg>
			<value>
				/test/** = anon
				/static/** = anon
				/userfiles/** = anon
				${adminPath}/cas = cas
				${adminPath}/login = authc
				${adminPath}/logout = logout
				${adminPath}/** = user
				/act/editor/** = user
				/ReportServer/** = user
			</value>
		</constructor-arg>
	</bean>
	
	<!-- 安全认证过滤器 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" /><!-- 
		<property name="loginUrl" value="${cas.server.url}?service=${cas.project.url}${adminPath}/cas" /> -->
		<property name="loginUrl" value="${adminPath}/login" />
		<property name="successUrl" value="${adminPath}?login" />
		<property name="filters">
            <map>
                <entry key="cas" value-ref="casFilter"/>
                <entry key="authc" value-ref="formAuthenticationFilter"/>
            </map>
        </property>
		<property name="filterChainDefinitions">
			<ref bean="shiroFilterChainDefinitions"/>
		</property>
	</bean>

    进入“index”方法需要“user”权限(进行shiro权限校验),否则会跳转到“loginUrl”对应的方法“${adminPath}/login”,即“http://localhost/项目名/a/login”,至此后台的登录流程大概解释清楚了。

 

展开阅读全文
打赏
2
2 收藏
分享
加载中
学习下 最近也是做这个分级
2019/02/20 20:50
回复
举报
更多评论
打赏
1 评论
2 收藏
2
分享
返回顶部
顶部