最近不忙了,将自己做过的一些东西写到博客上以防忘记
网站的权限管理部分采用了springsecurity3
第一步在pom.xml中加入以下代码
<!-- spring security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>3.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
第二步:新建applicationContext-security.xml进行开发前的一些配置
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
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-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd" default-autowire="byName">
<http auto-config="true" access-denied-page="/accessDenied.jsp" ><!-- 当访问被拒绝时,会转到403.jsp -->
<intercept-url pattern="" filters="none" />
<intercept-url pattern="/logout/logout.action" filters="none" />
<intercept-url pattern="/login.jsp" filters="none" />
<intercept-url pattern="/css/**" filters="none" />
<intercept-url pattern="/images/**" filters="none" />
<intercept-url pattern="/layout/**" filters="none" />
<intercept-url pattern="/js/**" filters="none" />
<intercept-url pattern="/style/**" filters="none" />
<intercept-url pattern="/baike_editor/**" filters="none" />
<intercept-url pattern="/commen/**" filters="none" />
<intercept-url pattern="/datepicker/**" filters="none" />
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=true"
default-target-url="/index.jsp" />
<logout logout-success-url="/login.jsp" />
<http-basic />
<!-- 增加一个filter,这点与Acegi是不一样的,不能修改默认的filter了,这个filter位于FILTER_SECURITY_INTERCEPTOR之前 -->
<custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="myFilter" />
<custom-filter after="PRE_AUTH_FILTER" ref="mycookiesfilter"/>
</http>
<!-- 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性,
我们的所有控制将在这三个类中实现,解释详见具体配置 -->
<beans:bean id="myFilter" class="com.specl.mis.login.filter.MyFilterSecurityInterceptor">
</beans:bean>
<!-- 认证管理器,实现用户认证的入口,主要实现UserDetailsService接口即可 -->
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="myUserDetailService">
<!--密码采用MD5加密 当然security也提供了盐值加密-->
<password-encoder hash="md5" />
</authentication-provider>
</authentication-manager>
<beans:bean id="myUserDetailService"
class="********" >
</beans:bean>
<!-- 访问决策器,决定某个用户具有的角色,是否有足够的权限去访问某个资源 -->
<beans:bean id="accessDecisionManager"
class="*****">
</beans:bean>
<!-- 资源源数据定义,即定义某一资源可以被哪些角色访问 -->
<beans:bean id="securityMetadataSource"
class="*****" />
<!--自定义username password 过滤器-->
<beans:bean id="authenticationProcessingFilter"
class="******">
</beans:bean>
<!--增加自定义的cookies过滤器-->
<beans:bean id="mycookiesfilter"
class="*******">
</beans:bean>
</beans:beans>
下面分析springsecurity的执行原理
从登陆开始
1、登陆--->2、根据用户名查询(注意只是根据用户名查询)--->3、验证密码(假设密码对)-->4、获取你要访问的url---->5、查找访问此url资源需要的权限------>6、用当前登录用户拥有的权限去和访问url资源需要的权限对比------>7、当前用户有该权限(登陆成功)否则登陆失败
ok有了这个思路后我们就开始将此汉语转成java
登陆
学过springsecurity的都知道该怎么写 很简单
<form id="form1" name="form1" method="post" action="${pageContext.request.contextPath}/j_spring_security_check">
<ul class="login_label input_bg1">
<li><label>登录名:</label><input type='text' id='j_username' name='j_username' class="required" /></li>
<li><label>密码:</label><input type='password' id='j_password' name='j_password' class="required" /></li>
<li><label>验证码:</label><input type="text" name="j_code" class="required put1" id="imagecode" autocomplete="off"/span id="code"></span></li>
</ul>
<p class="align3a"><span class="input_bg2"><input type="submit" name="button" id="button" value="登 录" /></span></p>
</form>
注意用户名和密码的name是固定的分别为j_username和但是验证码怎么加呢?一般的网站登陆可都是需要验证码的这个问题先留着
ok表单写好了 该提交登陆了
按照上面的流程应该到---按用户名进行查询
注意这个查询不是你想写到哪就写到哪的 我们必须写一个类该类需要实现UserDetailsServiceImpl接口
public UserDetails loadUserByUsername(String loginname) throws UsernameNotFoundException, DataAccessException {
}
该方法里面loginname就是你填写的登录名该参数不需要你传值,此方法返回一个对象UserDetails该对象是springSecurity提供的一个抽象类需要我们继承
public class MyUserDetails extends Operator implements UserDetails, Serializable {
public Collection<GrantedAuthority> getAuthorities() {
}
return null;
}
}
这个类干什么的呢 ?
注意在这个类中有一个方法getAuthorities此方法中我们需要获取登录用户拥有的权限然后一个集合
今天先写到这