前言
- shiro-cas-authority已经大体的介绍完毕,现在我们需要在各个应用程序之间来引用它实现权限管理。
Cas客户端与服务端的配置
- cas的客户端在shiro-cas-authority已经配置完成,我们配置cas的服务端时,可以将在源码上下载下来的cas文件夹放在tomcat的webapps目录下,然后启动tomcat,这样cas的服务端就生效了。
源码地址
应用程序配置
配置shiro.properties
- 每个应用程序都有自己的shiro.properties配置文件,在每个shiro.properties中配置的是用户登录成功后的默认访问地址,登录失败后默认访问地址,以及casServer的地址等等,正是因为用户在正确登录每个应用程序的时候访问的默认地址不一样,所以讲shiro.properties单独抽出来放在各个应用程序中。
应用程序的核心spring.xml文件
<context:component-scan base-package="com.spring.app1.service"/>
<context:component-scan base-package="com.spring.app1.dao"/>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:shiro.properties</value>
</list>
</property>
</bean>
<import resource="spring-mybatis.xml"/>
<!-- 引入shiro-cas-authority中的spring核心配置文件 -->
<import resource="classpath*:conf/spring-context-authority.xml"/>
应用程序的springmvc.xml文件
<!-- 注解扫描 -->
<mvc:annotation-driven />
<context:component-scan base-package="com.spring.app1.controller"></context:component-scan>
<!-- 配置视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 静态资源处理 -->
<!-- <mvc:default-servlet-handler /> -->
<mvc:resources location="/WEB-INF/js/" mapping="/js/**" />
<!-- 支持Shiro对Controller的方法级AOP安全控制 begin -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
<!-- 支持Shiro对Controller的方法级AOP安全控制 end -->
- 在springmvc的配置文件中,我们需要配置支持Shiro对Controller的方法级AOP安全控制,这样我们在Controller中的方法上加shiro的资源注解时,shiro就会自动判断用户是否拥有此权限。
后台Controller方法
@RequestMapping("/course")
@Controller
public class CourseController extends BaseController {
@Autowired
CourseService courseService;
@RequestMapping(value = {"/index"})
public String index() {
return "index";
}
@RequiresPermissions("query")
@RequestMapping("queryAllCourse")
@ResponseBody
public List<Course> queryAllCourse() {
List<Course> list =courseService.queryAllCourse();
Course course=new Course();
course.setComment("这是应用程序1查询出来的Course");
course.setCourseName("这是应用程序1查询出来的Course");
course.setId("1111111111111111111");
course.setCreate_time(new Date());
list.add(course);
return list;
}
@RequiresPermissions("create")
@RequestMapping("failureUrl")
@ResponseBody
public List<String> loninFailure() {
List<String> list = Arrays.asList("这是登录失败的后返回的结果","失败结果1","失败结果2");
return list;
}
/**
* 此方法admin没有权限访问,因为资源授权中 没有 delete
* @return
*/
@RequiresPermissions("delete")
@RequestMapping("delete")
@ResponseBody
public List<String> deleteMethod() {
List<String> list = Arrays.asList("这是登录失败的后返回的结果","失败结果1","失败结果2");
return list;
}
@RequestMapping("queryByAjax")
@ResponseBody
@RequiresPermissions("delete")
public List<String> queryByAjax(String username,String content) {
List<String> list = Arrays.asList("刘德华","张学友","黎明","郭富城");
System.out.println(username);
System.out.println(content);
return list;
}
}
启动程序,访问应用程序一(applicationOne)
访问地址:http://localhost:8083/app1/course/index
输入地址后,程序会自动跳转到cas的服务端,此时cas的登录页就显示出来了。
输入用户名:admin
密 码:admin@2015
登录成功后就会访问index.jsp这个页面就是测试用的所有方法,由于小编不能将项目中的所有源码都展示出来,所以小编只是将项目的框架抽离出来,展示个demo,读者拿到这套框架后可以根据自己的业务来修改和扩展。
小结
- 这一片博客只是贴出了源码中的applicationOne中的代码,读者可以将applicationTwo也启动起来,这样以来,当我们点击应用程序1中的跳往applicationTwo的时候,应用程序Two不会让我们登录了,至此,跨域的单点登录已经实现。