前言
- 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不會讓我們登錄了,至此,跨域的單點登錄已經實現。