安全管理 -Spring-Security
簡單例子:
1:加入spring-Securtiy 的jar包
2:在web.xml中配置
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3:修改applicationContext-security.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:ss="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<!--最簡單配置-->
<ss:http auto-config="true">
url攔截信息 /** 所有的
<ss:intercept-url pattern="/**" access="ROLE_ADMIN"/>
</ss:http>
<ss:authentication-provider>
<ss:user-service> 用戶的認證 authorities 權限
<ss:user password="admin" name="admin" authorities="ROLE_ADMIN"/>
<!--在第5步完成后添加一個用戶試驗 -->
輸入用戶名user,密碼user 會出現403 訪問拒絕的錯誤,原因是
權限ROLE_USER 在ss:intercept-url 沒有攔截任何url
如果修改上面如下:<ss:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER"/>
就沒有問題
<ss:user password="user" name="user" authorities="ROLE_USER"/>
</ss:user-service>
</ss:authentication-provider>
</beans>
4:啟動項目
5:http://localhost:8080/fpm/回車
會自動出現一個spring-security的一個登錄界面(自動生產的登錄界面)
輸入admin 和admin 就可以進入,否則會提示錯誤信息
6:登錄界面是系統給的。接下來是一個自定義的登錄界面
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/common/taglibs.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>FPM -- 管理系統</title>
<%@ include file="/common/metas.jsp"%>
</head>
<body>
action,name 用spring-security的固定格式
<form name="loginForm" action="${path}/j_spring_security_check" method="POST">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="j_username"/></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="j_password"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登錄"/></td>
</tr>
</table>
</form>
</body>
7:修改applicationContext-security.xml如下
在<ss:http auto-config="true">中增加如下代碼
<ss:form-login
login-page="登錄頁面"
authentication-failure-url="登錄失敗頁面"
default-target-url="登錄成功的頁面"
/>
8:啟動項目,輸入http://localhost:8080/fpm/ 發現進去不了
原因是:web.xml中的過濾器攔截了這個,然后跳轉到form-login中的login-page中
但是login-page 又被攔截,所以限入了死循環了
在這句前面加上<ss:intercept-url pattern="/**" access="ROLE_ADMIN"/>
<ss:intercept-url pattern="登錄頁面" filters="none"/> 表示登錄頁面不被過濾
9:怎么用數據庫去存儲用戶,密碼(這都是spring-security的默認方式)
create table users( --用戶表
username varchar2(50) not null,
password varchar2(50) not null,
enabled char(1) not null --當前用戶是否可用 boolean 也可以
);
create table authorities ( --權限表
username varchar2(50) not null, --用戶
authority varchar2(50) not null --權限
);
insert into users(username,password,enabled) values('admin','admin','1');
insert into users(username,password,enabled) values('user','user','1');
insert into authorities(username,authority) values('admin','ROLE_ADMIN');
insert into authorities(username,authority) values('admin','ROLE_USER');
insert into authorities(username,authority) values('user','ROLE_USER');
10:修改applicationContext-security.xml如下
先禁止<ss:authentication-provider> 然后添加如下
<ss:authentication-provider>
<ss:jdbc-user-service data-source-ref="spring中數據源名字"/>
</ss:authentication-provider>
11:運行項目 訪問數據庫中的用戶 也可以。
12:修改applicationContext-security.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:ss="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<ss:http auto-config="true">
<ss:intercept-url pattern="/common/**" filters="none"/>
<ss:intercept-url pattern="/css/**" filters="none"/>
<ss:intercept-url pattern="/images/**" filters="none"/>
<ss:intercept-url pattern="/js/**" filters="none"/>
IS_AUTHENTICATED_ANONYMOUSLY 表示匿名權限,所有匿名都來login.action中
<ss:intercept-url pattern="/login.action" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<ss:intercept-url pattern="/company/company.action" access="ROLE_ADMIN"/>
<ss:intercept-url pattern="/dept/dept.action" access="ROLE_USER"/>
IS_AUTHENTICATED_FULLY 默認權限,只要登錄就可以訪問(不管是admin還是其他權限)
<ss:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
<ss:form-login
login-page="/login.action"
authentication-failure-url="/login.action?error=true"
default-target-url="/"
/>
</ss:http>
<!--<ss:authentication-provider>
<ss:user-service>
<ss:user password="admin" name="admin" authorities="ROLE_ADMIN,ROLE_USER"/>
<ss:user password="user" name="user" authorities="ROLE_USER"/>
</ss:user-service>
</ss:authentication-provider>
-->
<ss:authentication-provider>
<ss:jdbc-user-service data-source-ref="dataSource"/>
</ss:authentication-provider>
</beans>
13:前面的都是默認的數據庫
自定義數據庫用戶權限管理
create table test_users( --用戶表
id varchar2(100) not null primary key,
username varchar2(200) not null,
password varchar2(200) not null,
enabled char(1) not null --當前用戶是否可用 boolean 也可以
);
數據為
1 admin admin 1
2 user user 1
create table test_role(
id varchar2(100) not null primary key,
role_name varchar2(100) not null
)
數據為
1 ROLE_ADMIN
2 ROLE_USER
create table test_user_role(
user_id varchar2(100),
role_id varchar2(100)
)
數據為
1 1
1 2
2 2
修改applicaitonContext-security.xml
<ss:authentication-provider>
<ss:password-encoder hash="md5"/>
<ss:jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username,password,enabled from test_user where username = ?"
authorities-by-username-query="select u.username,r.role_name authority from test_user u
join test_user_role ur on ur.user_id = u.id
join test_role r on ur.role_id = r.id
where u.username = ?"/>
</ss:authentication-provider>
users-by-username-query:由用戶名查詢出用戶
authorities-by-username-query:由用戶名查詢出權限
14:對數據加密(md5)