Spring Security 3.0データベース動的アクセス制御
開発環境SpringIDE 3.0、Spring Security 3.0.2、myibatis、Maven、MySql
最前面のスプリングコンフィギュレーションやMaven管理ラック、myibatisのコンフィギュレーションは言わない
まず、
1、必要なJARパッケージをpomに配置する必要がある
2、web.xmlにspring securityのフィルタチェーンを追加
3、アプリケーションContext-securityを追加する.xmlからルートディレクトリの下
内容は次のとおりです.
上はXMLファイルで、説明する必要があります:intercept-urlノードは少なくとも1つのブロックが必要です.もしすべてのフィルタリング画像やスタイルがあれば、springフレームワークが起動すると、関連するブロックのintercept-urlを構成していないので、誰もがリソース全体にアクセスできると思っています.
その中のノードの用途はすべて説明があって、くどくどしません
4、CustomUserDetailsService、CustomAccessDecisionManager、CustomFilterSecurityInterceptor、CustomInvocationSecurityMetadataSourceの作成
この4つのクラス私が定義したインタフェースは、対応する実装クラスがあり、動的権限制御を実装する上でこの4つのクラスが使用されます.
a、CustomUserDetailsServiceImplは、CustomUserDetailsServiceがorgから継承することを実現する.springframework.security.core.userdetails.UserDetailsService、このクラスは主にユーザー登録情報を処理し、ユーザーがユーザー名とパスワードを入力するとspring securityはユーザー名呼び出しクラスのloadUserByUsername(usrename)メソッドを持っています.ここで個人的には、パスワードを検証条件としてユーザー名でユーザー情報を検出し、データベースで検出したユーザーパスワードとさっきユーザーが入力したsessionに格納されたパスワードを比較していないことを理解しています.そしてそのユーザーが合法かどうかを判断します!
b、CustomAccessDecisionManagerImpl実装CustomAccessDecisionManagerはorgから継承する.springframework.security.access.AccessDecisionManager
このクラスは主にユーザーがあるURLにアクセスする时、そのクラスにアクセスする権限を通じてログインユーザーが持っている権限と比较して、もし権限を持っていれば、あなたは外星文明にアクセスすることができて、もし権限がなければ、あなたはアフリカに送還されて、また1つの异常を投げてあなたに教えて、あなたはすでにアフリカに送還されました!
c、C u s t o m F i l t e r S e c u rityInterceptorImplは、C u s t o m F i l t e r S e c u rityInterceptorがjavaxを継承することを実現する.servlet.Filter
このクラスの目的はブロックの入口で、まず起動する時に注入の中の属性を注入して、それからユーザーがあなたの配置したURLにアクセスする時、ブロックされてdoFilterの方法の中に入って、infoke()の方法を呼び出してCustomAccessDecisionManagerImplに入ります.decide()メソッドでは、アクセスするurlと構成されたurlの権限を比較します.
d、C u s t o m F i l t e r I n v o c t i o n S e c u r t y MetadataSourceImpl実装C u s t o m F i l t e r I v o c t i o n S e c u r t y MetadataSource継承
org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource
このクラスの主な役割はSpring Securityのフィルタチェーン全体が起動した後、コンテナが起動するとプログラムがそのクラスに入るinit()メソッドで、initはloadResourceDefine()メソッドを呼び出し、このメソッドの主な目的はデータベース内のすべてのリソースと権限をローカルキャッシュに読み込んで保存することです!クラスのresourceMapは、保存されているすべてのリソースと権限の集合であり、URLはKeyであり、権限はValueとして機能します!
以上がspring securityで使用するコードで、次はデータベースです.
5、データベース設計なら標準の7枚の表
1、pub_authorities
2、pub_resources
3、pub_authorities_resources
4、pub_roles
5、pub_roles_authorities
6、pub_users
7、pub_users_roles
最初に実行した時pub_authoritysテーブルに格納されているのはAUTH_***でもspring securityはROLEしか知らないみたい接頭辞の権限は、ROLE_のみです.接頭辞は比較できるので注意が必要ですloadResourceDefine()メソッドのresourceMapのURLに対する権限は、ROLE_である必要があります.接頭辞のデータ!もしあなたが確定していないならば、方法でresourceMapの値を印刷して見てもいいです!
ここでは、myibatisベースのSQLで使用されるクエリー・メソッドのSQLをいくつか提供します.
1、getAuthoritiesByUsername(String username)
2、getUser(String username)
3、getResourcesByAuthName(String authName)
4、getAllAuthoritys()
最前面のスプリングコンフィギュレーションやMaven管理ラック、myibatisのコンフィギュレーションは言わない
まず、
1、必要なJARパッケージをpomに配置する必要がある
2、web.xmlにspring securityのフィルタチェーンを追加
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
3、アプリケーションContext-securityを追加する.xmlからルートディレクトリの下
内容は次のとおりです.
上はXMLファイルで、説明する必要があります:intercept-urlノードは少なくとも1つのブロックが必要です.もしすべてのフィルタリング画像やスタイルがあれば、springフレームワークが起動すると、関連するブロックのintercept-urlを構成していないので、誰もがリソース全体にアクセスできると思っています.
その中のノードの用途はすべて説明があって、くどくどしません
4、CustomUserDetailsService、CustomAccessDecisionManager、CustomFilterSecurityInterceptor、CustomInvocationSecurityMetadataSourceの作成
この4つのクラス私が定義したインタフェースは、対応する実装クラスがあり、動的権限制御を実装する上でこの4つのクラスが使用されます.
a、CustomUserDetailsServiceImplは、CustomUserDetailsServiceがorgから継承することを実現する.springframework.security.core.userdetails.UserDetailsService、このクラスは主にユーザー登録情報を処理し、ユーザーがユーザー名とパスワードを入力するとspring securityはユーザー名呼び出しクラスのloadUserByUsername(usrename)メソッドを持っています.ここで個人的には、パスワードを検証条件としてユーザー名でユーザー情報を検出し、データベースで検出したユーザーパスワードとさっきユーザーが入力したsessionに格納されたパスワードを比較していないことを理解しています.そしてそのユーザーが合法かどうかを判断します!
package com.doone.wisdom.security.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.doone.wisdom.dao.security.UserDao;
import com.doone.wisdom.entity.security.RoleEntity;
import com.doone.wisdom.entity.security.UserEntity;
import com.doone.wisdom.security.service.CustomUserDetailsService;
/**
* TODO( ).
* @ClassName: CustomUserDetailsServiceImpl
* @author Johnny_L_Q
*/
@Service("customUserDetailsService")
public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
/**
* @Fields serialVersionUID : TODO( ).
*/
private static final long serialVersionUID = 1L;
@Resource
private UserDao userDao;
/*
*
* Title: loadUserByUsername
* Description:
* @param arg0
* @return
* @throws UsernameNotFoundException
* @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
*/
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
UserEntity user = userDao.getUser(username);
if (null == user) {
throw new UsernameNotFoundException(" " + username + " ");
}
Collection auths = new ArrayList();
List list = userDao.getAuthoritiesByUsername(username);
for (int i = 0; i < list.size(); i++) {
auths.add(new GrantedAuthorityImpl(list.get(i)));
System.out.println("loadUserByUsername : " + list.get(i));
}
// UserEntity UserDetails, user
return new User(username, user.getPassword(), true, true, true, true, auths);
}
}
b、CustomAccessDecisionManagerImpl実装CustomAccessDecisionManagerはorgから継承する.springframework.security.access.AccessDecisionManager
このクラスは主にユーザーがあるURLにアクセスする时、そのクラスにアクセスする権限を通じてログインユーザーが持っている権限と比较して、もし権限を持っていれば、あなたは外星文明にアクセスすることができて、もし権限がなければ、あなたはアフリカに送還されて、また1つの异常を投げてあなたに教えて、あなたはすでにアフリカに送還されました!
package com.doone.wisdom.security.impl;
import java.util.Collection;
import java.util.Iterator;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.stereotype.Service;
import com.doone.wisdom.security.service.CustomAccessDecisionManager;
/**
*
* AccessdecisionManager Spring security 。
*
* , Authentication GrantedAuthority 。 。
* GrantedAuthority AuthenticationManager
* Authentication , AccessDecisionManager , 。
*
* Spring Security , , web 。
* , AccessDecisionManager 。 AccessDecisionManager
* AbstractSecurityInterceptor , 。
* AccessDecisionManager :
*
* void decide(Authentication authentication, Object secureObject,
* List config) throws AccessDeniedException; boolean
* supports(ConfigAttribute attribute); boolean supports(Class clazz);
*
* ,AccessDecisionManager , 。
* , , Object 。 , MethodInvocation。
* Customer MethodInvocation,
* AccessDecisionManager , 。
* , AccessDeniedException 。
*
* supports(ConfigAttribute)
* AbstractSecurityInterceptor , AccessDecisionManager
* ConfigAttribute。 supports(Class) ,
* AccessDecisionManager 。
* TODO( ).
* @ClassName: CustomAccessDecisionManagerImpl
* @author Johnny_L_Q
*/
@Service("customAccessDecisionManager")
public class CustomAccessDecisionManagerImpl implements
CustomAccessDecisionManager {
/*
* Title: decide
* Description:
* @param arg0
* @param arg1
* @param arg2
* @throws AccessDeniedException
* @throws InsufficientAuthenticationException
* @see org.springframework.security.access.AccessDecisionManager
* #decide(org.springframework.security.core.Authentication, java.lang.Object, java.util.Collection)
*/
@Override
public void decide(Authentication authentication, Object object,
Collection configAttributes) throws AccessDeniedException,
InsufficientAuthenticationException {
if (null == configAttributes) {
return;
}
Iterator cons = configAttributes.iterator();
while(cons.hasNext()){
ConfigAttribute ca = cons.next();
String needRole = ((SecurityConfig) ca).getAttribute();
//gra ,needRole
for (GrantedAuthority gra : authentication.getAuthorities()) {
if (needRole.trim().equals(gra.getAuthority().trim())) {
return;
}
}
}
throw new AccessDeniedException("Access Denied");
}
/*
* Title: supports
* Description:
* @param arg0
* @return
* @see org.springframework.security.access.AccessDecisionManager#supports(org.springframework.security.access.ConfigAttribute)
*/
@Override
public boolean supports(ConfigAttribute arg0) {
// TODO Auto-generated method stub
return true;
}
/*
* Title: supports
* Description:
* @param arg0
* @return
* @see org.springframework.security.access.AccessDecisionManager#supports(java.lang.Class)
*/
@Override
public boolean supports(Class> arg0) {
// TODO Auto-generated method stub
return true;
}
}
c、C u s t o m F i l t e r S e c u rityInterceptorImplは、C u s t o m F i l t e r S e c u rityInterceptorがjavaxを継承することを実現する.servlet.Filter
このクラスの目的はブロックの入口で、まず起動する時に注入の中の属性を注入して、それからユーザーがあなたの配置したURLにアクセスする時、ブロックされてdoFilterの方法の中に入って、infoke()の方法を呼び出してCustomAccessDecisionManagerImplに入ります.decide()メソッドでは、アクセスするurlと構成されたurlの権限を比較します.
package com.doone.wisdom.security.impl;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.SecurityMetadataSource;
import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
import org.springframework.security.access.intercept.InterceptorStatusToken;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.stereotype.Service;
import com.doone.wisdom.security.service.CustomFilterSecurityInterceptor;
/**
* spring IoC securityMetadataSource。
* securityMetadataSource CostomInvocationSecurityMetadataSourceService。
* CostomInvocationSecurityMetadataSourceService , HashMap ,
* Spring Security , 。
*
* TODO( ).
* @ClassName: CustomFilterSecurityInterceptorImpl
* @author Johnny_L_Q
*/
@Service("customFilterSecurityInterceptor")
public class CustomFilterSecurityInterceptorImpl extends
AbstractSecurityInterceptor implements CustomFilterSecurityInterceptor {
@Resource
@Qualifier("customInvocationSecurityMetadataSource")
private FilterInvocationSecurityMetadataSource securityMetadataSource;
@Resource
@Qualifier("customAccessDecisionManager")
@Override
public void setAccessDecisionManager(
AccessDecisionManager accessDecisionManager) {
// TODO Auto-generated method stub
super.setAccessDecisionManager(accessDecisionManager);
}
/* @Resource
@Qualifier("customAccessDecisionManager")
public AccessDecisionManager accessDecisionManager;*/
/* @Resource
@Qualifier("authenticationManager")
public AuthenticationManager authenticationManager;*/
@Resource
@Qualifier("authenticationManager")
@Override
public void setAuthenticationManager(AuthenticationManager newManager) {
super.setAuthenticationManager(newManager);
}
/*
* Title: doFilter
* Description:
* @param arg0
* @param arg1
* @param arg2
* @throws IOException
* @throws ServletException
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
FilterInvocation fi = new FilterInvocation(request, response, chain);
infoke(fi);
}
/**
* TODO( ).
* @param fi
* @throws ServletException
* @throws IOException
*/
private void infoke(FilterInvocation fi) throws IOException, ServletException {
InterceptorStatusToken token = super.beforeInvocation(fi);
try {
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
} finally {
super.afterInvocation(token, null);
}
}
/*
* Title: init
* Description:
* @param arg0
* @throws ServletException
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
/*
* Title: getSecureObjectClass
* Description:
* @return
* @see org.springframework.security.access.intercept.AbstractSecurityInterceptor#getSecureObjectClass()
*/
@Override
public Class> getSecureObjectClass() {
// TODO Auto-generated method stub
return FilterInvocation.class;
}
/*
* Title: obtainSecurityMetadataSource
* Description:
* @return
* @see org.springframework.security.access.intercept.AbstractSecurityInterceptor#obtainSecurityMetadataSource()
*/
@Override
public SecurityMetadataSource obtainSecurityMetadataSource() {
// TODO Auto-generated method stub
return this.securityMetadataSource;
}
/*
* Title: destroy
* Description:
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {
return securityMetadataSource;
}
public void setSecurityMetadataSource(
FilterInvocationSecurityMetadataSource securityMetadataSource) {
this.securityMetadataSource = securityMetadataSource;
}
}
d、C u s t o m F i l t e r I n v o c t i o n S e c u r t y MetadataSourceImpl実装C u s t o m F i l t e r I v o c t i o n S e c u r t y MetadataSource継承
org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource
このクラスの主な役割はSpring Securityのフィルタチェーン全体が起動した後、コンテナが起動するとプログラムがそのクラスに入るinit()メソッドで、initはloadResourceDefine()メソッドを呼び出し、このメソッドの主な目的はデータベース内のすべてのリソースと権限をローカルキャッシュに読み込んで保存することです!クラスのresourceMapは、保存されているすべてのリソースと権限の集合であり、URLはKeyであり、権限はValueとして機能します!
package com.doone.wisdom.security.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.util.AntUrlPathMatcher;
import org.springframework.security.web.util.UrlMatcher;
import org.springframework.stereotype.Service;
import com.doone.wisdom.entity.security.AuthorityEntity;
import com.doone.wisdom.entity.security.RoleEntity;
import com.doone.wisdom.security.service.CustomInvocationSecurityMetadataSource;
import com.doone.wisdom.service.iface.AuthorityService;
import com.doone.wisdom.service.iface.ResourceService;
/**
* TODO( ).
* @ClassName: CustomInvocationSecurityMetadataSourceImpl
* @author Johnny_L_Q
*/
@Service("customInvocationSecurityMetadataSource")
public class CustomInvocationSecurityMetadataSourceImpl implements
CustomInvocationSecurityMetadataSource {
@Resource
private ResourceService resourceService;
@Resource
private AuthorityService authorityService;
private UrlMatcher urlMatcher = new AntUrlPathMatcher();
//private AntPathRequestMatcher pathMatcher;
private HashMap> resourceMap = null;
/**
*
* , Spring ,
* init ,
* TODO( ).
*/
@PostConstruct
public void init() {
loadResourceDefine();
}
/**
*
* TODO( ).
*/
private void loadResourceDefine() {
// Web , 。
//sql = "select authority_name from pub_authorities";
List query = authorityService.getAllAuthoritys();
/**//*
* key, value。 url, ROLE_ 。 。
* sparta
*/
resourceMap = new HashMap>();
for (AuthorityEntity auth : query) {
String authName = auth.getAuthorityName();
ConfigAttribute ca = new SecurityConfig(auth.getAuthorityName());
List resources = resourceService.getResourcesByAuthName(authName);
for (String str : resources) {
//String authName = auth2.getAuthorityName();
String url = str;
/**//*
* , url, url key , 。
* sparta
*/
if (resourceMap.containsKey(url)) {
Collection value = resourceMap.get(url);
value.add(ca);
resourceMap.put(url, value);
} else {
Collection atts = new ArrayList();
atts.add(ca);
resourceMap.put(url, atts);
}
}
}
}
/**
* TODO( , List Collection ).
* @param roles
* @return list Collection
*/
private Collection listToCollection(List roles) {
List list = new ArrayList();
for (RoleEntity role : roles) {
list.add(new SecurityConfig(role.getRoleName()));
}
return list;
}
/*
* Title: getAllConfigAttributes
* Description:
* @return
* @see org.springframework.security.access.SecurityMetadataSource#getAllConfigAttributes()
*/
@Override
public Collection getAllConfigAttributes() {
return null;
}
/*
* Title: getAttributes
* Description:
* @param arg0
* @return
* @throws IllegalArgumentException
* @see org.springframework.security.access.SecurityMetadataSource#getAttributes(java.lang.Object)
*/
@Override
public Collection getAttributes(Object object)
throws IllegalArgumentException {
//object URL , URL
String url = ((FilterInvocation)object).getRequestUrl();
if("/".equals(url)){
return null;
}
int firstQuestionMarkIndex = url.indexOf(".");
// (/index.do --> /index)
if(firstQuestionMarkIndex != -1){
url = url.substring(0,firstQuestionMarkIndex);
}
Iterator ite = resourceMap.keySet().iterator();
// URL
while (ite.hasNext()) {
String resURL = ite.next();
if(urlMatcher.pathMatchesUrl(url, resURL)){
return resourceMap.get(resURL);
}
}
return null;
}
/*
* Title: supports
* Description:
* @param arg0
* @return
* @see org.springframework.security.access.SecurityMetadataSource#supports(java.lang.Class)
*/
@Override
public boolean supports(Class> arg0) {
// TODO Auto-generated method stub
return true;
}
}
以上がspring securityで使用するコードで、次はデータベースです.
5、データベース設計なら標準の7枚の表
1、pub_authorities
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:29:52
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_authorities
-- ----------------------------
CREATE TABLE `pub_authorities` (
`authority_id` varchar(32) COLLATE utf8_bin NOT NULL,
`authority_name` varchar(40) COLLATE utf8_bin NOT NULL,
`authority_desc` varchar(100) COLLATE utf8_bin DEFAULT NULL,
`enabled` int(10) NOT NULL,
`issys` int(10) NOT NULL,
PRIMARY KEY (`authority_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_authorities` VALUES ('1', 'ROLE_ADMIN', ' ', '1', '0');
INSERT INTO `pub_authorities` VALUES ('2', 'ROLE_USER', ' ', '1', '0');
2、pub_resources
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:30:25
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_resources
-- ----------------------------
CREATE TABLE `pub_resources` (
`resource_id` varchar(32) COLLATE utf8_bin NOT NULL,
`resource_name` varchar(100) COLLATE utf8_bin NOT NULL,
`resource_type` varchar(40) COLLATE utf8_bin NOT NULL,
`priority` int(10) NOT NULL,
`resource_string` varchar(200) COLLATE utf8_bin NOT NULL,
`resource_desc` varchar(100) COLLATE utf8_bin DEFAULT NULL,
`enabled` int(10) NOT NULL,
`issys` int(10) NOT NULL,
PRIMARY KEY (`resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_resources` VALUES ('1', ' ', 'action', '0', '/funcPages/adManager', ' ', '1', '0');
INSERT INTO `pub_resources` VALUES ('2', ' ', 'action', '0', '/index', ' ', '1', '0');
3、pub_authorities_resources
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:30:17
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_authorities_resources
-- ----------------------------
CREATE TABLE `pub_authorities_resources` (
`id` varchar(32) COLLATE utf8_bin NOT NULL,
`authority_id` varchar(32) COLLATE utf8_bin NOT NULL,
`resource_id` varchar(32) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_res_aut` (`authority_id`),
KEY `fk_res` (`resource_id`),
CONSTRAINT `fk_res` FOREIGN KEY (`resource_id`) REFERENCES `pub_resources` (`resource_id`),
CONSTRAINT `fk_res_aut` FOREIGN KEY (`authority_id`) REFERENCES `pub_authorities` (`authority_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_authorities_resources` VALUES ('1', '1', '1');
INSERT INTO `pub_authorities_resources` VALUES ('2', '2', '2');
4、pub_roles
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:30:30
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_roles
-- ----------------------------
CREATE TABLE `pub_roles` (
`role_id` varchar(32) COLLATE utf8_bin NOT NULL,
`role_name` varchar(100) COLLATE utf8_bin NOT NULL,
`role_desc` varchar(100) COLLATE utf8_bin DEFAULT NULL,
`enabled` int(10) NOT NULL,
`issys` int(10) NOT NULL COMMENT ' ',
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_roles` VALUES ('1', 'ROLE_ADMIN', ' ', '1', '0');
INSERT INTO `pub_roles` VALUES ('2', 'ROLE_USER', ' ', '1', '0');
5、pub_roles_authorities
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:30:36
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_roles_authorities
-- ----------------------------
CREATE TABLE `pub_roles_authorities` (
`id` varchar(32) COLLATE utf8_bin NOT NULL,
`role_id` varchar(32) COLLATE utf8_bin NOT NULL,
`authority_id` varchar(32) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_aut_role` (`role_id`),
KEY `fk_aut` (`authority_id`),
CONSTRAINT `fk_aut` FOREIGN KEY (`authority_id`) REFERENCES `pub_authorities` (`authority_id`),
CONSTRAINT `fk_aut_role` FOREIGN KEY (`role_id`) REFERENCES `pub_roles` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_roles_authorities` VALUES ('1', '1', '1');
INSERT INTO `pub_roles_authorities` VALUES ('2', '1', '2');
INSERT INTO `pub_roles_authorities` VALUES ('3', '2', '2');
6、pub_users
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:30:42
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_users
-- ----------------------------
CREATE TABLE `pub_users` (
`user_id` varchar(32) COLLATE utf8_bin NOT NULL,
`user_account` varchar(30) COLLATE utf8_bin NOT NULL,
`user_name` varchar(40) COLLATE utf8_bin NOT NULL,
`user_password` varchar(100) COLLATE utf8_bin NOT NULL,
`enabled` int(10) NOT NULL,
`issys` int(10) NOT NULL,
`user_desc` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT ' ',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_users` VALUES ('1', 'admin', 'admin', '21232f297a57a5a743894a0e4a801fc3', '1', '1', ' ');
INSERT INTO `pub_users` VALUES ('2', 'user', 'user', 'ee11cbb19052e40b07aac0ca060c23ee', '1', '0', ' ');
7、pub_users_roles
/*
MySQL Data Transfer
Source Host: localhost
Source Database: wisdom
Target Host: localhost
Target Database: wisdom
Date: 2012/10/19 9:30:48
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for pub_users_roles
-- ----------------------------
CREATE TABLE `pub_users_roles` (
`id` varchar(32) CHARACTER SET utf8 NOT NULL,
`user_id` varchar(32) COLLATE utf8_bin NOT NULL,
`role_id` varchar(32) COLLATE utf8_bin NOT NULL COMMENT ' ',
PRIMARY KEY (`id`),
KEY `fk_user` (`user_id`),
KEY `fk_role` (`role_id`),
CONSTRAINT `fk_role` FOREIGN KEY (`role_id`) REFERENCES `pub_roles` (`role_id`),
CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `pub_users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `pub_users_roles` VALUES ('1', '1', '1');
INSERT INTO `pub_users_roles` VALUES ('2', '2', '2');
最初に実行した時pub_authoritysテーブルに格納されているのはAUTH_***でもspring securityはROLEしか知らないみたい接頭辞の権限は、ROLE_のみです.接頭辞は比較できるので注意が必要ですloadResourceDefine()メソッドのresourceMapのURLに対する権限は、ROLE_である必要があります.接頭辞のデータ!もしあなたが確定していないならば、方法でresourceMapの値を印刷して見てもいいです!
ここでは、myibatisベースのSQLで使用されるクエリー・メソッドのSQLをいくつか提供します.
1、getAuthoritiesByUsername(String username)
select b.authority_name
from
PUB_ROLES a,
PUB_AUTHORITIES b,
PUB_ROLES_AUTHORITIES c
where c.role_id = a.role_id and c.authority_id = b.authority_id and a.role_name in
(select role_name from
PUB_USERS_ROLES ur,
PUB_USERS u,
PUB_ROLES r
where ur.user_id = u.user_id and ur.role_id = r.role_id and u.user_name = #{username}
)
2、getUser(String username)
select * from
PUB_USERS u
where u.user_name = #{username}
3、getResourcesByAuthName(String authName)
select b.resource_string from PUB_AUTHORITIES_RESOURCES a ,PUB_RESOURCES b, PUB_AUTHORITIES c
where a.resource_id = b.resource_id and a.authority_id = c.authority_id and c.authority_name = #{authName}
4、getAllAuthoritys()
select * from pub_authorities